nHibernate会话和multithreading

我有一个方法,有很多持久性调用使用nHibernate会话,它工作,没关系。 但是出于multithreading的原因,我需要重构这个方法,从循环内的内容中提取方法。 然后我用这个方法创建了一个类。 它就像一个正常的重构,但是这个方法调用中的nHibernate会话被破坏了,没有上下文,我没有随时完成它。 multithreading有nHibernate问题吗? 即使我只有一个线程正在执行,我也有同样的问题。

我通过SessionFactory和Façade模式使用nHibernate Session,这意味着,会话不是这些对象的字段,它在SessionFactory是全局的。


让它更清晰一点:

之前:

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

后:

 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 } 

我们的nHibernate会话工厂是线程感知的,并且每个线程存储/检索nHibernate会话。 它现在很好用;)

通过设计,会话在NHibernate中不是线程安全的 。 所以只要你只有一个线程使用会话就应该没问题。

我不确定你是什么东西,但是如果你在原始线程中创建的同一个会话中有一些持久性调用 – 这很可能是你的问题的原因,你可以在你的新创建一个单独的会话如果我的假设是真的,那么它将成为每个线程的一个会话。

NHibernate引用在10.2节中有它

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

只要每个线程都有一个单独的NHibernate会话,就可以为多个线程提供一个NHibernate SessionFactory。

这是一个示例,它将提供exception,因为它为每个线程使用相同的会话:

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

解决方案是在LocaldataStoreSlot上存储会话,这样您就可以拥有每个请求的会话模型。