Le comportement original (2.x) d'Hibernate pour la gestion des connexions JDBC était que la Session
obtenait une connexion dès qu'elle en avait besoin et la libérait une fois la session fermée. Hibernate 3 a introduit les
modes de libération de connexion pour indiquer à la session comment gérer les transactions JDBC. Notez que la discussion suivante
n'est pertinente que pour des connexions fournies par un ConnectionProvider
, celles gérées par l'utilisateur sont en dehors du scope de cette discussion. Les différents modes sont définies par org.hibernate.ConnectionReleaseMode
:
ON_CLOSE
- is essentially the legacy behavior described above. The Hibernate session obtains a connection when it first needs to perform
some JDBC access and holds unto that connection until the session is closed.
AFTER_TRANSACTION
- indique de relacher la connexion après qu'une org.hibernate.Transaction
se soit achevée.
AFTER_STATEMENT
(aussi appelé libération brutale) - indique de relacher les connexions après chaque exécution d'un statement. Ce relachement
aggressif est annulé si ce statement laisse des ressources associées à une session donnée ouvertes, actuellement ceci n'arrive
que lors de l'utilisation de org.hibernate.ScrollableResults
.
Le paramètre de configuration hibernate.connection.release_mode
est utilisé pour spécifier quel mode de libération doit être utiliser. Les valeurs possibles sont:
auto
(valeur par défaut) - ce choix délègue le choix de libération à la méthode org.hibernate.transaction.TransactionFactory.getDefaultReleaseMode()
Pour la JTATransactionFactory, elle retourne ConnectionReleaseMode.AFTER_STATEMENT; pour JDBCTransactionFactory, elle retourne
ConnectionReleaseMode.AFTER_TRANSACTION. C'est rarement une bonne idée de changer ce comportement par défaut puisque les erreurs
soulevées par ce paramétrage tend à prouver une erreur dans le code de l'utilisateur.
on_close
- indique d'utiliser ConnectionReleaseMode.ON_CLOSE. Ce paramétrage existe pour garantir la compatibilité avec les versions
précédentes, mais ne devrait plus être utilisé.
after_transaction
- indique d'utiliser ConnectionReleaseMode.AFTER_TRANSACTION. Ne devrait pas être utilisé dans les environnements JTA. Notez
aussi qu'avec ConnectionReleaseMode.AFTER_TRANSACTION, si une session est considérée comme étant en mode auto-commit les connexions
seront relachées comme si le mode était AFTER_STATEMENT.
after_statement
- indique d'utiliser ConnectionReleaseMode.AFTER_STATEMENT. Additonnellement, le ConnectionProvider
utilisé est consulté pour savoir s'il supporte ce paramétrage (supportsAggressiveRelease()
). Si ce n'est pas le cas, le mode de libération est ré initialisé à ConnectionReleaseMode.AFTER_TRANSACTION. Ce paramétrage
n'est sûr que dans les environnements où il est possible d'obtenir à nouveau la même connexion JDBC à chaque fois que l'on
fait un appel de ConnectionProvider.getConnection()
ou dans les envrionnements auto-commit où il n'est pas important d'obtenir plusieurs fois la même connexion.