Je cherche autour d'essayer de déterminer du comportement hiberné que je ne suis pas sûr. Dans un scénario dans lequel Hibernate Batching est correctement configuré, il n'utilisera-t-il que plusieurs relevés d'insertion lorsqu'un lot est envoyé? N'est-il pas possible d'utiliser une instruction multi-inserts indépendante DB? P>
Je suppose que j'essaie de déterminer si je dispose de la configuration correctement par lots. Je vois les multiples déclarations d'insertion, mais je vois aussi la ligne "Exécution de la taille du lot: 25." p>
Il y a beaucoup de code que je pourrais poster mais j'essaie de garder ce général. Donc, mes questions sont: p>
1) Que pouvez-vous lire dans les journaux pour être certain que le lots est utilisé? p>
2) est-il possible de faire de l'hibernate d'utiliser une insertion à plusieurs lignes par rapport à plusieurs instructions d'insertion multiples? P>
4 Réponses :
Hibernate utilise plusieurs instructions d'insertion (une par entité à insertion), mais les envoie à la base de données en mode batch (en utilisant énoncé.addbatch () code>
et relève.executeBatch () code>
). C'est la raison pour laquelle vous voyez plusieurs relevés d'insertion dans le journal, mais aussi "Taille du lot d'exécution: 25". p>
L'utilisation d'énoncés par lots réduit considérablement le nombre de retours à la base de données et je serais surpris s'il était moins efficace que d'exécuter une seule instruction avec plusieurs inserts. De plus, il permet également de mélanger des mises à jour et des insertions, par exemple dans un seul appel de base de données. P>
Je suis sûr que je ne suis pas possible de faire utiliser Hibernate d'inserts à plusieurs rangées, mais je suis aussi sûr que ce serait inutile. P>
Cool, qui me rassure. Je pensais que c'est ainsi que cela travaillait mais je n'ai pas réalisé que les déclarations de lots sont probablement aussi bonnes qu'une seule instruction de déclaration. Merci.
Je sais que c'est une question ancienne, mais j'avais le même problème que je pensais que Hibernate Batching signifie que Hibernate combinerait plusieurs inserts dans une seule déclaration qu'il ne semble pas faire. P>
Après quelques tests, j'ai trouvé cette réponse qu'un lot de multiples inserts est tout aussi bon qu'un insert à plusieurs rangées. J'ai fait un test insérant 1000 rangées une fois en utilisant un lot hibernate et une fois sans. Les deux tests ont pris environ 20 ans, il n'y avait pas de gain de performance dans l'utilisation du lot Hibernate. P>
Assurez-vous que j'ai essayé d'utiliser l'option RewriteBatchedStatifs à partir du connecteur MySQL / j qui combine réellement plusieurs inserts dans une seule déclaration. Il a réduit le temps d'insérer 1000 enregistrements jusqu'à 3s. P>
Ainsi, après que tout le lot d'hibernate semble être inutile et qu'un véritable insert à plusieurs rangées sera bien meilleur. Est-ce que je fais quelque chose de mal ou de ce qui cause mes résultats de test? P>
L'insert de bulk Oracle Recueillez un tableau d'entente et transmettez-le dans un seul blocage de la DB Associateur à celui-ci une insertion / mise à jour ciclique Unic / Supprimer. P>
est une manière unic de répercuter le débit de réseau. P>
Oracle suggère de le faire appeler une procédure stockée de Hibernate qui lui transmettait un tableau de données. P>
http: //biemond.blogspot.it/2012/03/oracle-bulk-insert-or-select-from-java.html?m=1 N'est-ce pas seulement un problème logiciel mais infrastructural! Le problème est l'optimisation des flux de données réseau et la fragmentation de la pile TCP. MySQL a la fonction. Vous devez faire quelque chose comme ce qui est décrit dans cet article. Transfert normal sur réseau Le volume correct des données est la solution p>
Vous devez également vérifier le réseau MTU et Oracle SDU / TDU UTILISATION Respect des données transférées entre application et base de données P>
Je visiterais réellement la base de données pour voir ce qui se passe sous le capot. SQLServer a un profileur qui peut vous dire presque tout. Avec Oracle, vous préférerez visiter V $ SQL Object. lien
Je l'ai fait et depuis ce que je pouvais dire, cela n'utilise jamais des déclarations d'insertion. J'ai lu quelque part que les journaux hibernés étaient trompeurs, mais je pense que c'était parce que cet exemple particulier utilisait MySQL qui possède une option de réécritureBatchedStatifs qui fera le travail (j'utilise Oracle).