12

我有一个使用 nHibernate 会话的具有大量持久性调用的方法,它有效,没问题。但是出于多线程的原因,我需要重构这个方法,从循环内的内容中提取一个方法。然后我用这个方法创建了一个类。这就像一个正常的重构,但是这个方法调用中的 nHibernate 会话被破坏了,没有上下文,我没有任何时候完成它。多线程有 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 会话。它现在运行良好;)

4

2 回答 2

17

在 NHibernate 中,会话在设计上不是线程安全的。因此,只要您的会话仅由一个线程使用就可以了。

我不确定你是 thingResolver 做了什么,但如果它对你在原始线程中创建的同一个会话进行一些持久性调用 - 这很可能是你的问题的原因,你可以在你的新会话中创建一个单独的会话线程,这样如果我的假设是真的,这将是每个线程的会话。

NHibernate 参考在第 10.2 节中有它

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

于 2008-10-28T11:40:42.767 回答
0

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

这是一个示例,它会给出异常,因为它为每个线程使用相同的会话:

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

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

于 2011-01-08T21:06:34.807 回答