2010-02-05 10 views
1

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?

Répondre

0

Voodoo? Découvrez comment effectuer le suivi Oracle. Votre DBA devrait vous aider. Avec un fichier de trace, vous pouvez consulter les événements d'attente d'Oracle. Cela vous dira ce que la base de données faisait quand «la performance est atroce». Il pourrait être en attente sur une serrure, il pourrait être en train de lire une table ....

Une fois que vous savez pourquoi il est lent, la solution devient souvent évidente.

Je recommande cette whitepaper comme une instruction pour les développeurs sur l'utilisation de bases de données.

1

Avez-vous besoin de la cascade? Toutes les entités enfants sont-elles mises à jour sur les insertions?

+0

Bon point, +1 – whiskeysierra

+0

Les entités enfants sont toutes en cours d'insertion, en cascade depuis la table parente. –