【发布时间】:2011-12-06 03:46:52
【问题描述】:
我正在编写一个应用程序,我终于将它正确保存到数据库中。但是,我有一些问题,如果有人可以帮助我指出正确的方向,我正在徘徊。
在我的应用程序加载期间,我启动了一个 NHibernate 初始化线程,该线程初始化 NHibernate,然后启动 3 个单独的线程来加载我的 3 个对象,以便拆分和优化加载时间。
我最初是在每个线程中创建一个临时会话,以便从数据库中查询对象;但是,我在访问我的对象集合之一时遇到问题,说会话未打开或已关闭。我有一个可在整个 Windows 应用程序中全局访问的静态会话,当它为集合调用 GetEnumerator 时,此会话的状态仍处于打开状态。
我认为这与所讨论的类 Intersection 在初始化过程中从线程中的不同会话加载这一事实有关。从同一个会话中加载所有对象工作正常;但是,我确实会不时遇到异常,其中涉及以非线程安全方式使用会话的错误。
那么我的问题是这个。有没有办法将会话“合并”到我的全局会话中?为了加载集合,我可以做些什么来将 Intersection 类设置为它具有打开会话的位置?是我需要在主线程中打开静态全局程序会话的问题吗?或者我将无法在我的初始化过程中将 3 个不同类的加载线程化到 3 个单独的线程中?
【问题讨论】:
-
上次我检查时,NHibernate 会话不是线程安全的。
-
是的,我知道这一点。有没有办法将一个会话与另一个会话合并,以便线程 A 知道从线程 B 加载到会话中的对象?否则,有没有办法修复我在那个对象中的集合访问权限?
-
您可以将从一个会话加载的对象“合并”到另一个会话中。我不太确定整个会话。
-
你是如何做到这一点的?
-
您使用 ISession 的 Merge() 方法将对象移动到会话中
标签: nhibernate