我对NHIbernate有一个奇怪的问题,并且看到这是我的第一个NHIbernate项目,我以为我会问StackOverflow.com的好人。
我正在遵循ASP.Net中的“在视图中打开会话”模式,该模式在每个请求上打开一个hibernate事务并在请求结束时提交它。
这通常很好用,但是在我的一个页面上,这只是一个阅读页面而不是写入页面,我遇到了问题。有问题的页面会获得一个项目列表,并根据它们对信息进行一些查询。
作为其中的一部分,它调用一个外部DLL,它有一个SQL查询到其内部的数据库。此调用似乎适用于所有项目,除了一个,它在ExecuteReader()调用上获得超时。
在尝试查找外部DLl中的错误一段时间后,我决定在http处理程序内注释掉事务的建立。这解决了这个问题。
因此,以某种方式休眠会话管理正在影响外部的,无关的(好吧,有些映射可能会触及该查询中使用的相同数据库,但是它只能在两端读取)
我的问题是,为什么要这样做?什么是nhibernate在引擎盖下导致其他SQL查询超时?我认为它对数据库的某些部分有锁定,但是如果页面只读取,为什么会这样做呢?我怎么能绕过这个?
编辑: 本指南的以下部分 http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx
更多信息: 我有一个IHttpModule,它在BeginRequest
中执行以下操作private void BeginTransaction(object sender, EventArgs e)
{
Console.WriteLine("Begin Transaction");
NHibernateSessionManager.Instance.BeginTransaction();
}
然后关闭
private void CommitAndCloseSession(object sender, EventArgs e)
{
Console.WriteLine("End Transaction");
try
{
NHibernateSessionManager.Instance.CommitTransaction();
}
finally
{
NHibernateSessionManager.Instance.CloseSession();
}
}
NHIbernateSEssionManager执行此操作: - 在HTTPContext中存储ITransaction + ISession。这些可以作为名为ContextTransaction和ContextSession的属性访问。这些用于:
public void BeginTransaction()
{
ITransaction transaction = ContextTransaction;
if (transaction == null)
{
transaction = GetSession().BeginTransaction();
ContextTransaction = transaction;
}
}
public void CommitTransaction()
{
ITransaction transaction = ContextTransaction;
try
{
if (HasOpenTransaction())
{
transaction.Commit();
ContextTransaction = null;
}
}
catch (HibernateException)
{
RollbackTransaction();
throw;
}
}
答案 0 :(得分:0)
从它的声音我猜测有一个环境分布式交易导致交叉影响。您是否使用TransactionScope
类来管理交易?