我有一个方法有很多使用 nHibernate session 的持久性调用,它有效,没问题。但出于多线程原因,我需要重构此方法,从循环内的内容中提取方法。然后我用这个方法创建了一个类。这就像一个正常的重构,但是这个方法调用中的 nHibernate session 被破坏了,没有上下文,我没有在任何时候完成它。 nHibernate 是否存在多线程问题?即使我只执行一个线程,我也会遇到同样的问题。
我通过 SessionFactory 和 Façade 模式使用 nHibernate Session,这意味着, 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 session 工厂是线程感知的,并且为每个线程存储/检索 nHibernate session 。它现在运行良好 ;)
最佳答案
NHibernate 中的 session 不是线程安全的设计。 因此,只要您有一个仅由一个线程使用的 session ,就应该没问题。
我不确定你在做什么 thingResolver 做了什么,但如果它对你在原始线程中创建的相同 session 进行了一些持久性调用 - 这很可能是你出现问题的原因,您可以在新线程中创建一个单独的 session ,这样如果我的假设成立,那么它将是每个线程一个 session 。
NHibernate 引用资料在第 10.2 节中有它
关于c# - nHibernate session 和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/242961/