【问题标题】:NHibernate Session access thru multiple threadsNHibernate Session 通过多个线程访问
【发布时间】:2011-12-06 03:46:52
【问题描述】:

我正在编写一个应用程序,我终于将它正确保存到数据库中。但是,我有一些问题,如果有人可以帮助我指出正确的方向,我正在徘徊。

在我的应用程序加载期间,我启动了一个 NHibernate 初始化线程,该线程初始化 NHibernate,然后启动 3 个单独的线程来加载我的 3 个对象,以便拆分和优化加载时间。

我最初是在每个线程中创建一个临时会话,以便从数据库中查询对象;但是,我在访问我的对象集合之一时遇到问题,说会话未打开或已关闭。我有一个可在整个 Windows 应用程序中全局访问的静态会话,当它为集合调用 GetEnumerator 时,此会话的状态仍处于打开状态。

我认为这与所讨论的类 Intersection 在初始化过程中从线程中的不同会话加载这一事实有关。从同一个会话中加载所有对象工作正常;但是,我确实会不时遇到异常,其中涉及以非线程安全方式使用会话的错误。

那么我的问题是这个。有没有办法将会话“合并”到我的全局会话中?为了加载集合,我可以做些什么来将 Intersection 类设置为它具有打开会话的位置?是我需要在主线程中打开静态全局程序会话的问题吗?或者我将无法在我的初始化过程中将 3 个不同类的加载线程化到 3 个单独的线程中?

【问题讨论】:

  • 上次我检查时,NHibernate 会话不是线程安全的。
  • 是的,我知道这一点。有没有办法将一个会话与另一个会话合并,以便线程 A 知道从线程 B 加载到会话中的对象?否则,有没有办法修复我在那个对象中的集合访问权限?
  • 您可以将从一个会话加载的对象“合并”到另一个会话中。我不太确定整个会话。
  • 你是如何做到这一点的?
  • 您使用 ISession 的 Merge() 方法将对象移动到会话中

标签: nhibernate


【解决方案1】:

您可以将与其他会话加载的对象图与您的主会话相关联。

  • 如果对象可能已更改,则 MainSession.Merge(obj) 因为它将加载 Db-State 以了解更改的内容。

  • 如果对象没有改变,那么MainSession.Lock(obj, LockMode.None) 足以将其与主会话相关联。

之后,您可以像使用主会话加载对象一样使用这些对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多