2011-10-12 75 views
0

我正在编写一个应用程序,并最终将它保存到数据库中。但是,如果有人能帮助我指出正确的方向,我会遇到一些问题,并且正在徘徊。NHibernate会话通过多线程访问

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

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

我相信它与在初始化过程中线程的不同会话中加载的Intersection相关的事实有关。从同一会话中加载所有对象都可以正常工作;然而,我会偶尔遇到异常,并以非线程安全方式使用会话时发生错误。

我的问题是这样的。有没有办法将会话“合并”到我的全局会话中?我能做些什么来设置Intersection类到它有一个打开的会话为了加载集合?是否需要在主线程中打开静态全局程序会话的会话?或者我将无法将我的init进程中3个不同类的加载线程分成3个独立的线程?

+0

我最后一次检查,NHibernate的会议分别不是线程安全的。 –

+0

是的,我知道这一点。有什么办法可以将会话与另一个会话合并,所以线程A知道从线程B加载到会话中的对象?否则,有没有办法解决我的收藏访问在一个对象? –

+0

您可以将从一个会话加载的对象“合并”到另一个会话中。我不太确定整个会议。 –

回答

2

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

  • 如果对象可能已经改变,那么MainSession.Merge(obj),因为它会载入DB-国家知道发生了什么变化。

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

之后,你就可以使用的对象,好像他们是载有您的主会议