web-dev-qa-db-fra.com

Quelle est la différence entre hibernate.jdbc.fetch_size et hibernate.jdbc.batch_size?

Je suis en train d’ajuster mon application, je suis tombé sur quelques blogs parlant de la récupération par lots et de la sélection par lots, et qui ont bien compris ce qui suit.

  • hibernate.jdbc.fetch_size - Utilisé pour spécifier le nombre de lignes à extraire dans une requête de sélection.
  • hibernate.jdbc.batch_size - Utilisé pour spécifier le nombre d'insertions ou de mises à jour à effectuer dans une base de données unique.

S'il vous plaît laissez-moi savoir si ma compréhension est correcte ou non? Aussi quelles sont les valeurs optimales pour les paramètres ci-dessus.

10
Bhargav Kumar R

Ces deux options définissent les propriétés dans le pilote JDBC. Dans le premier cas, hibernate.jdbc.fetch_size définit la taille d'extraction de l'instruction dans le pilote JDBC, c'est-à-dire le nombre de lignes extraites lorsqu'il y a plus d'un résultat de ligne dans les instructions select.

Dans le second cas, hibernate.jdbc.batch_size détermine le nombre de mises à jour (insertions, mises à jour et suppressions) envoyées simultanément à la base de données pour exécution. Ce paramètre est nécessaire pour effectuer des insertions par lots, mais doit être associé au paramètre des insertions commandées et à la capacité du pilote JDBC à réécrire les insertions dans une instruction d'insertion de lots. 

Voir ce lien

14
Trevor Gowing

Vos hypothèses sont correctes.

hibernate.jdbc.fetch_size

La propriété de configuration hibernate.jdbc.fetch_size Hibernate est utilisée pour définir la propriété JDBC Statement#setFetchSize pour chaque instruction utilisée par Hibernate au cours du contexte de persistance en cours d'exécution.

Généralement, vous n'avez pas besoin de définir cette propriété car la valeur par défaut est correcte, en particulier pour MySQL et PostgreSQL, qui récupèrent l'intégralité de la variable ResultSet dans un aller-retour unique dans la base de données. Comme Hibernate parcourt toute la ResultSet, il est préférable d'extraire toutes les lignes d'un même tir au lieu d'utiliser plusieurs allers-retours.

Pour Oracle uniquement, vous voudrez peut-être le définir, car la taille d'extraction par défaut est de seulement 10. Pour plus de détails, consultez cet article .

hibernate.jdbc.batch_size

La propriété hibernate.jdbc.batch_size est utilisée pour regrouper plusieurs instructions INSERT <UPDATE et DELETE afin qu’elles puissent être définies dans un seul appel à la base de données.

Si vous définissez cette propriété, il est préférable de définir ces deux éléments également:

  • hibernate.order_inserts à true
  • hibernate.order_updates à true

Pour plus de détails, consultez ces deux articles:

4
Vlad Mihalcea

Votre compréhension semble tout à fait correcte. Je vous renvoie à la documentation JBOSS sur Hibernate, le chapitre suivant porte sur Traitement par lots . Et celui-ci sur optimisation des performances .

C'est une bonne source facile à lire. Il donne quelques suggestions sur les valeurs optimales, mais comme CodeChimp l’a mentionné, l’optimisation s’effectue au cas par cas et est répétable dans le temps.

0
jvdp

La taille de récupération fait Statement.setFetchSize() alors que la taille de lot est destinée au traitement par lots Hibernate. Les deux paramètres de configuration sont expliqués ici . Pour hibernate batch se référer ici

0
Saket