【问题标题】:nHibernate session and multithreadingnHibernate 会话和多线程
【发布时间】:2010-09-19 13:38:29
【问题描述】:

我有一个使用 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 会话。它现在运行良好;)

【问题讨论】:

    标签: c# multithreading nhibernate session


    【解决方案1】:

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

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

    NHibernate 参考在第 10.2 节中有它

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

    【讨论】:

    • 感谢阿列克谢。我会遇到问题(与另一个会话一起工作),因为它违反了我的设计,我正在考虑忘记这个多线程的事情。
    • 事实上,我的会话工厂很健壮,可以为每个线程维护一个会话,它的工作原理:D
    • 只是给下一代的一个小提示:有些库不是单线程的,即使你认为它们是。我们使用了一个自定义的 log4net Appender 和 NHibernate Session 实例,然后我们花了将近一个月的时间寻找一个由 log4net 在另一个线程中写入日志这一简单事实引起的错误。
    【解决方案2】:

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

    这里有一个例子,因为它为每个线程使用相同的会话,所以会给出异常:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多