2008-10-28 4 views
12

J'avais une méthode avec beaucoup d'appels de persistance qui utilisaient une session nHibernate, ça fonctionnait, ça allait. Mais j'avais besoin de refactoriser cette méthode, en extrayant une méthode d'un contenu à l'intérieur d'une boucle, pour des raisons multithread. Ensuite, j'ai créé une classe avec cette méthode. C'est comme un refactoring normal, mais la session nHibernate dans cet appel de méthode est cassée, sans contexte, je ne l'ai pas finalisé à aucun moment. Est-ce que nHibernate a des problèmes de multithreading? Même lorsque je n'ai plus qu'un thread en cours d'exécution, j'ai le même problème.nHibernate session et multithread

J'utilise nHibernate Session via un modèle SessionFactory et Façade, cela signifie que la session n'est pas un champ de ces objets, elle est globale chez SessionFactory.


Faire un peu plus clair:

AVANT:

Method() 
{ 
... persistence calls 
foreach(Thing..) 
{ 
...persistence calls for each thing (1) 
} 
... 
} 

APRÈS:

Method() 
{ 
... persistence calls 
foreach(Thing..) 
{ 
create a thingResolver object with some data 
open a new thread with thingResolver.Method (1) 
starts this thread 
} 
.. waits for finishing threads and continues 
} 

Notre nHibernate Session Factory est sensible aux threads et stocke/récupère la session nHibernate par thread. Il fonctionne bien maintenant;)

Répondre

17

sessions sont pas thread sécurité dans NHibernate par la conception. Cela devrait donc être correct tant que vous avez une session utilisée par un seul thread.

Je ne suis pas sûr de ce que vous êtes thingResolver fait, mais si elle fait des appels sur la Persistance même session que vous avez créé dans le thread d'origine - ce plus probablement la cause de vos problèmes, vous pouvez créer une session distincte dans votre nouveau thread afin que ce soit une session par thread si mon hypothèse est vraie.

référence NHibernate il a dans la section 10,2

http://nhibernate.info/doc/nh/en/index.html#transactions

+0

merci Aleksey. J'aurai des problèmes pour le faire (travailler avec une autre session), car cela viole mon design, je pense à oublier cette chose multithread. –

+0

en fait, ma fabrique de sessions est robuste et peut maintenir une session par thread, son fonctionnement: D –

+1

Lien mis à jour à la documentation http://nhforge.org/doc/nh/fr/index.html#transactions – AlfeG

0

Vous pouvez avoir un NHibernate SessionFactory pour plusieurs threads aussi longtemps que vous avez une session NHibernate pour chaque fil.

ici est un exemple qui donnera des exceptions, car il utilise la même session pour chaque thread:

https://forum.hibernate.org/viewtopic.php?p=2373236&sid=db537baa5a57e3968abdda5cceec2a24

La solution est de stocker des sessions sur la LocaldataStoreSlot, de cette façon vous pouvez avoir une session par modèle de demande