Nous utilisons @OneToMany
pour notre Parenthood> Enfant-> Enfant-> relation enfant DB:problème de performance avec Hibernate OneToMany/relation annulable
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "THE_ID", nullable = false)
private List<ChildClass> children = new ArrayList<ChildClass>();
Nous avons un scénario avec beaucoup de données (100K inserts) où la performance est atroce (en fait expire) lors de l'insertion. Avec une petite quantité de données (1K inserts), nous sommes cependant bien.
Donc, sans raison valable j'ai enlevé le nullable = false
et changé la clé étrangère de DB sur les tables d'enfant pour permettre des nulls et presto la représentation est assez bonne. Quelqu'un peut-il expliquer cela?
Mise à jour: Tourné le débogage .. Avec nullable = false
il semble y avoir un énorme goulot d'étranglement générant les ids pour les tables enfant. Nous délai d'attente d'attente pour les ids de générer, avec cela dans le journal à plusieurs reprises:
[org.hibernate.event.def.AbstractSaveEventListener] [ ] generated identifier: <743088>, using strategy: org.hibernate.id.IncrementGenerator
Nous ne même pas eu à insérer les données à la DB. Nous sommes juste coincés sur l'id gen. Actuellement, nous configurons Hibernate pour générer des ID en regardant les valeurs id max actuellement dans la table des enfants:
@Id
@GeneratedValue(generator = "DummyString")
@GenericGenerator(name = "DummyString", strategy = "increment")
@Column(name = "THE_ID", nullable = false)
private Long id;
Avant cela, nous utilisions une séquence DB et a vu les mêmes problèmes. Lorsque nous omettons nullable = false
, nous voyons ces instructions ID gen (108K d'entre elles), mais elles se terminent en 25 secondes. Alors, pourquoi ces déclarations (littéralement) prennent-elles pour toujours avec nullable = false
?
Bon point, +1 – whiskeysierra
Les entités enfants sont toutes en cours d'insertion, en cascade depuis la table parente. –