使用NHibernate在web应用程序中进行异步查询
在web应用程序中,会话仅在当前线程中可用 有没有人知道在新的异步线程中通过NHibernate执行查询的技巧 例如,我如何才能使这样的工作:使用NHibernate在web应用程序中进行异步查询,nhibernate,asynchronous,Nhibernate,Asynchronous,在web应用程序中,会话仅在当前线程中可用 有没有人知道在新的异步线程中通过NHibernate执行查询的技巧 例如,我如何才能使这样的工作: public void Page_Load() { ThreadPool.QueueUserWorkItem(state => FooBarRepository.Save(new FooBar())); } 会话不是线程安全的。如果您在一个线程上创建会话并从另一个线程使用它,那么您迟早会遇到问题。在后台线程上创建一个新会话,并在后台线程完
public void Page_Load()
{
ThreadPool.QueueUserWorkItem(state => FooBarRepository.Save(new FooBar()));
}
会话不是线程安全的。如果您在一个线程上创建会话并从另一个线程使用它,那么您迟早会遇到问题。在后台线程上创建一个新会话,并在后台线程完成之前将其关闭。如何:
public void Page_Load()
{
ThreadPool.QueueUserWorkItem(state => NHibernateSessionFactory.GetSession().Save(new FooBar()));
}
您需要有一个足够智能的会话上下文来处理非web上下文。但更重要的是,新线程应该有自己的会话 您可以使用以下内容:
private ISession threadSession
{
get
{
if (HttpContext.Current != null)
{
return (ISession)HttpContext.Current.Items["THREAD_SESSION"];
}
return (ISession)AppDomain.CurrentDomain
.GetData("THREAD_SESSION" + Thread.CurrentThread.ManagedThreadId);
}
set
{
if (HttpContext.Current != null)
{
HttpContext.Current.Items["THREAD_SESSION"] = value;
}
else
{
AppDomain.CurrentDomain.SetData("THREAD_SESSION"
+Thread.CurrentThread.ManagedThreadId, value);
}
}
}
我也有同样的问题。NHibernate ISession存储在HttpContext中,而HttpContext在异步方法中不可用。有办法解决这个问题吗?如果希望会话比HttpContext寿命更长,为什么要将会话存储在HttpContext中?因为这是web应用程序中的标准做法,这可能会导致内存/连接池泄漏