web-dev-qa-db-fra.com

Pourquoi "hibernate.connection.autocommit = true" n'est-il pas recommandé dans Hibernate?

Dans l'API Hibernate, il existe une propriété hibernate.connection.autocommit qui peut être définie sur true. 

Mais dans l'API, ils ont mentionné qu'il n'est pas recommandé de le définir comme suit:

Active autocommit pour les connexions en pool JDBC (cela n'est pas recommandé ).

Pourquoi n'est-il pas recommandé? Quels sont les effets pervers de la définition de cette propriété sur true?

19
Ponmudi VN

Par défaut, la valeur autocommit est false et la transaction doit donc être validée explicitement. C'est peut-être pour cette raison que les modifications ne sont pas reflétées dans la base de données. Sinon, vous pouvez essayer de les vider pour les forcer avant la validation.

Lorsque vous fermez la session, elle sera implicitement validée dans la base de données [dépend de l'implémentation].

Lorsque vous avez des transactions en cascade et que vous avez besoin de revenir en arrière pour Atomicity, vous devez avoir le contrôle des transactions. Dans ce cas, autocommit doit être faux.

Définissez autocommit sur true ou gérez les transactions explicitement.

Ici est une bonne explication à ce sujet.

Forum Hibernate lié à cela.

Question Stackoverflow dessus.

13
user3145373 ツ

D'après ce que je comprends, si Hibernate effectue des autocommissions automatiquement, un flush échoué en partie ne sera pas annulé. Vous aurez un graphe d'objet incomplet/cassé.

Si vous souhaitez une connexion avec autocommit sur quelque chose, vous pouvez toujours décompresser une Session nouvellement créée pour obtenir la connexion JDBC sous-jacente, setAutocommit(true), faire votre travail via les API JDBC, setAutocommit(false) et fermer la session. Je recommanderais non de faire ceci sur une Session qui a déjà déjà été faite.

6
Craig Ringer

Toutes les instructions de base de données sont exécutées dans le contexte d’une transaction physique, même si nous ne déclarons pas explicitement les limites de la transaction } (BEGIN/COMMIT/ROLLBACK).

Si vous ne déclarez pas les limites de la transaction, chaque instruction devra être exécutée dans une transaction distincte. Cela peut même conduire à ouvrir et fermer une connexion par déclaration.

Déclarer un service en tant que @Transactional vous donnera une connexion pour toute la durée de la transaction et toutes les instructions utiliseront cette connexion d'isolation unique. C'est bien mieux que de ne pas utiliser des transactions explicites en premier lieu. Sur les applications volumineuses, vous pouvez avoir plusieurs demandes simultanées et réduire le taux de demande d’acquisition de connexion à la base de données } _ améliore nettement les performances globales de votre application.

La règle de base est donc:

  1. Si vous avez des transactions en lecture seule qui n'exécutent qu'une seule requête, vous pouvez activer la validation automatique pour celles-ci.

  2. Si vous avez des transactions contenant plusieurs instructions, vous devez désactiver la validation automatique, car vous souhaitez que toutes les opérations soient exécutées dans une seule unité de travail et vous ne souhaitez pas exercer de pression supplémentaire sur votre pool de connexions.

5
Vlad Mihalcea

N'utilisez pas l'antipaternel de session par opération: n'ouvrez et ne fermez pas de session pour chaque appel de base de données simple dans un seul thread. Il en va de même pour les transactions de base de données. Les appels de base de données dans une application sont effectués en utilisant une séquence planifiée; ils sont regroupés en unités de travail atomiques. Cela signifie également que la validation automatique après chaque instruction SQL est inutile dans une application, car ce mode est destiné au travail ad-hoc de la console SQL. Hibernate désactive ou attend du serveur d'applications qu'il désactive le mode de validation automatique immédiatement. Les transactions de base de données ne sont jamais optionnelles. Toute communication avec une base de données doit avoir lieu à l'intérieur d'une transaction. Le comportement d'auto-validation pour la lecture des données doit être évité, car de nombreuses petites transactions ne fonctionneront probablement pas mieux qu'une unité de travail clairement définie. Ce dernier est également plus maintenable et extensible.

trouver plus d'informations sur ce sujet

2
newday