c# - nHibernate session 和多线程

标签 c# multithreading nhibernate session

我有一个方法有很多使用 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 节中有它

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

关于c# - nHibernate session 和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/242961/

相关文章:

C# 反射 : Emitting classes to existing assemblies

c# - 读取 CSV 到对象列表

c# - 立即为在 ContinueWith block 内构建的调用调用任务?

c++ - activemq-cpp 抛出 "Thread local storage limit"发送时到达

c# - Linq 到 NHibernate : how to get a list of child objects without having the lists nested

c# - SQL Server 响应时间不一致

android - 将处理程序变量从MainActivity类传递到android kotlin中的后台线程类的最佳方法是什么?

java - 要求 FutureTask 在取消之前启动

NHibernate HQL : How to use the new object constructor with 'distinct' ?

database - 在 Windows 服务中使用 nHibernate