NHibernate Session通过多个线程访问

时间:2011-10-12 13:36:42

标签: nhibernate

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

在我的应用程序加载期间,我启动了一个初始化NHibernate的NHibernate初始化线程,然后触发3个独立的线程来加载我的3个对象,以便分割并优化加载时间。

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

我认为这与以下事实有关:交叉点(相关类)是在init过程中从线程中的不同会话加载的。从同一会话加载所有对象工作正常;但是,我会不时遇到异常,并且会以非线程安全的方式使用会话。

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

1 个答案:

答案 0 :(得分:2)

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

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

  • 如果对象未更改,则MainSession.Lock(obj, LockMode.None)足以将其与主会话关联。

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