Мы используем @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
?
Хорошая точка там, +1 – whiskeysierra
Все дочерние объекты вставлены, каскадируются из родительской таблицы. –