2010-02-05 3 views
1

Мы используем @OneToMany для наших родителей-> ляющих> детей-> Детские БД отношений:проблемы производительности Hibernate с OneToMany/обнуляемым отношением

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name = "THE_ID", nullable = false) 
private List<ChildClass> children = new ArrayList<ChildClass>(); 

У нас есть сценарий с большим количеством данных (100K вставки), где при вставке производительность является жестокой (на самом деле время ожидания). При небольшом количестве данных (вставки 1K) мы, тем не менее, прекрасны.

Так что без уважительной причины я удалил nullable = false и изменил внешний ключ БД на дочерние таблицы, чтобы разрешить нулевые значения, а предварительная производительность неплохая. Может ли кто-нибудь объяснить это?


Update: Включается отладки .. С nullable = false, как представляется, огромный узким местом генерации идентификаторов для дочерних таблиц. Мы тайм-аут в ожидании идентификаторы для генерации, с этим в журнале снова и снова:

[org.hibernate.event.def.AbstractSaveEventListener] [ ] generated identifier: <743088>, using strategy: org.hibernate.id.IncrementGenerator 

Мы никогда не добраться до вставки данных в БД. Мы просто зацикливаемся на id gen. В настоящее время мы настроим Hibernate для генерации идентификаторов, глядя на максимальных значениях идентификаторов в настоящее время в дочерней таблице:

@Id 
@GeneratedValue(generator = "DummyString") 
@GenericGenerator(name = "DummyString", strategy = "increment") 
@Column(name = "THE_ID", nullable = false) 
private Long id; 

До этого мы использовали последовательность DB и видели одни и те же вопросы.

Когда мы опускаем nullable = false, мы видим эти эти утверждения ID gen (108K из них), но они заканчиваются через 25 секунд. Итак, почему эти заявления (буквально) берут навсегда с nullable = false?

ответ

0

Voodoo? Узнайте, как выполнять трассировку Oracle. Ваш администратор базы данных должен помочь.

С файлом трассировки вы можете посмотреть события ожидания Oracle. Это скажет вам, что делает база данных, когда «производительность ужасная». Он мог ждать на замке, он мог читать таблицу.

Как только вы знаете, почему это медленно, решение часто становится очевидным.

Я рекомендую этот whitepaper в качестве инструкции для разработчиков по работе с базами данных.

1

Вам нужен Каскад? Обновлены ли все дочерние объекты на вставках?

+0

Хорошая точка там, +1 – whiskeysierra

+0

Все дочерние объекты вставлены, каскадируются из родительской таблицы. –