Le thread de session d’Hibernate est-il sûr?

J’ai besoin de savoir si la session d’Hibernate est thread-safe ou non. Mais il est évident qu’une nouvelle session est attachée à chaque thread pour exécution. Mais ma question est de savoir si, dans un seul thread, j’ai mis à jour certaines valeurs d’une entité. Cela sera-t-il reflété dans d’autres threads lors de l’exécution en même temps?

Mon problème est que lorsque je lance séquentiellement la mise à jour à partir de deux threads, la valeur est correctement mise à jour mais lorsque je lance la mise à jour presque complètement, elle échoue.

pour par exemple. stade actuel de la table.

ID NAME MARKS ------- --------- -------- 1 John 54 

J’essaie de faire ce qui suit:

 Student student = session.load(Student.class, 1); student.setMarks(student.getMarks() + 1); session.update(student); session.close(); 

Lorsque j’essaie d’exécuter le code ci-dessus en boucle, disons 10, alors la valeur de “marks” dans le tableau “student” est correctement mise à jour, c.-à-d.

Mais lorsque j’essaie d’exécuter le même code dans un environnement threadé, les résultats sont mauvais.

Il n’est pas prévu que les implémenteurs soient threadsafe. Au lieu de cela, chaque thread / transaction devrait obtenir sa propre instance à partir d’une SessionFactory.

Même dans cette optique, votre comportement peut ne pas être ce que vous attendez, car les transactions entrent en jeu. Vous devrez définir un niveau d’isolation de transaction correct. Voir le guide de configuration , propriété hibernate.connection.isolation .

Hibernate session et les threads ne se mélangent pas.

Vous ne devez pas utiliser une session à partir de plusieurs threads à la fois, et je vous recommande de n’utiliser qu’une session à partir d’un seul thread. Les implémentations de session de firebase database ne doivent même pas être sécurisées.

Vous devez également tenir compte de ce qu’il advient des transactions lorsque vous commencez à faire des choses dans plusieurs threads. Les transactions sont liées au thread en cours. Cela devient rapidement époustouflant et vous entrez dans des zones où les développeurs n’ont pas testé leurs produits.

À la fin, la vie est trop courte pour se perdre dans ce marais.

Les sessions Hibernate ne sont pas thread-safe. Utilisez la classe TheadLocal pour créer des sessions pour chaque thread: –

  private static ThreadLocal threadSafeSession = new ThreadLocal() { protected Session initialValue(){ return sf.openSession(); } }; 

Dans votre méthode, obtenez une session pour chaque thread en tant que: –

 Session session = threadSafeSession.get(); 

Cela dépend de la façon dont vous créez une session.

La session peut être créée de deux manières en mode veille prolongée.

  1. getCurrentSession ()

Oui. Il offre une sécurité de thread car il s’assurera qu’il créera une session pour chaque thread si la session n’existe pas. la transaction et la fermeture automatique de la session sont attachées à ceci.

  1. openSession ()

Ce n’est pas thread-safe. Le développeur doit gérer manuellement les transactions et les opérations de vidage et de fermeture de session.

L’object Session a été conçu pour être utilisé par un seul thread. En interne, la session utilise de nombreuses structures de données non-thread-safe, il est donc impossible de la rendre compatible avec les threads.

De plus, vous ne devriez même pas avoir besoin d’utiliser une session thread-safe. Si votre cas d’utilisation consiste à partager les entités mises en cache, vous devez utiliser le cache de second niveau, qui est compatible avec les threads et peut être utilisé dans un environnement en cluster.

Cela étant dit, le besoin d’avoir une session thread-safe est une odeur de code indiquant une faille dans la conception de la couche d’access aux données.