【发布时间】:2011-10-12 11:25:35
【问题描述】:
我想用每个请求实现的会话来重建多线程 NHibernate 应用程序。
现在这个应用程序看起来像每个会话(每个线程)的会话,并将会话保存到 CurrentSessionContext 中。
但是这种实现带来了加载缓存实体的问题,这些实体可能已经从其他会话中更新。所以我想改变这段代码
//main thread
using (nHibernateHelper.OpenConnection()){
List<Bar> bars = BarRepository.Instance.GetAll();
foreach (Bar bar in bars){
//start thread and do some work, for example run DoWork(bar); by other thread
Task.Factory.StartNew(DoWork, bar);
}
}
//other thread
void DoWork(Bar bar){
using (nHibernateHelper.OpenConnection()){
foreach (Foo foo in bar.FooList){
if (foo.SomeState == PredifinedState) {
//call many other functions
}
}
}
}
主要问题是:如何更改此代码,在使用 LazyLoading 启动其他线程之前关闭 Session(Bar 包含与其他对象的关系,并且在线程工作期间使用此关系),以及在从 foreach 语句调用其他函数之前DoWork 函数?
【问题讨论】:
-
我使用 ThreadStaticSessionContext 上下文会话,并且 nHibernateHelper.OpenConnection() 是 IDisposable 从 CurrentSessionContext 返回此会话(或使用绑定/取消绑定创建新的)。
标签: nhibernate session lazy-loading