mardi 11 décembre 2007

Hibernate session en multithread

J'utilise plusieurs threads pour la requête affichage de liste dans une application WEB. Lorsque je lance une requête en servant de la session Hibernate (partagée par les différents threads) j'obtiens le message suivant :
Exception in thread "Thread-41" org.hibernate.HibernateException: Not able to obtain connection
at
org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:113)

Le forum http://forums.hibernate.org/viewtopic.php?t=945337 suggère de passer dans un mode transactionnel, mais cela ne fonctionne pas dans mon cas. Il suggère également de laisser spring la possibilité de créer des connexions sur les threads qui en ont le besoin à l'aide de l'option allowCreate

à true ou bien de faire des requête callback.

Réponse :

La session hibernate gèe une seule connection et n'est pas thread safe : on ne peut pas partager une instance de session par plusieurs threads à moins d'utiliser les mécanismes de synchronisation.

C'est la même chose pour une connection JDBC : on ne peut pas avoir un thread qui lit les résultats d'une requête tandis qu'un autre tente de lancer un autre select sur la
même connection.


Tu peux faire rendre ton code thread safe si ton cas d'utilisation le permet en utilisant le mot clef synchronized.

// un seul thread à la fois peut exécuter ce code
synchronized {

// mon code

}

ou

synchronized(maSession) {
// mon code

}