我在使用SqlServer 2008的ASP.NET C#应用程序中使用NHibernate 3.3.3。
DetachedCriteria _pageCriteria = CriteriaTransformer.Clone(criteria)
.SetMaxResults(maxResult)
.SetFirstResult(firstResult);
_recordCount= _countCriteria.GetExecutableCriteria(session).FutureValue<int>();
var _pageCriteriaFuture = _pageCriteria.GetExecutableCriteria(session).Future<T>();
_pageCriteriaFuture.ToList();
如果我尝试执行上一个代码,我会收到TimeOut错误:
Failed to execute multi criteria[SQL:
SELECT count(*) as y0_ FROM Articoli this_ WHERE ((contains(this_.Oggetto, ?) or contains(this_.CorpoPlaintext, ?) or contains(this_.ParoleChiavi, ?) or contains(this_.SottoTitoloPlainText, ?)));
SELECT TOP (?) this_.Id as Id13_0_, this_.Corpo as Corpo13_0_, this_.CorpoPlaintext as CorpoPla3_13_0_, this_.Data as Data13_0_, this_.DataInserimento as DataInse5_13_0_, this_.LinkPagina as LinkPagina13_0_, this_.Numero as Numero13_0_, this_.Oggetto as Oggetto13_0_, this_.Tag as Tag13_0_, this_.NumeroVisualizzazioni as NumeroV10_13_0_, this_.IsConsigliatoRedazione as IsConsi11_13_0_, this_.ParoleChiavi as ParoleC12_13_0_, this_.SottoTitolo as SottoTi13_13_0_, this_.SottoTitoloPlainText as SottoTi14_13_0_, this_.idArticoloOld as idArtic15_13_0_, this_.IdUser as IdUser13_0_
FROM Articoli this_ WHERE ((contains(this_.Oggetto, ?) or contains(this_.CorpoPlaintext, ?) or contains(this_.ParoleChiavi, ?) or contains(this_.SottoTitoloPlainText, ?))) ORDER BY this_.DataInserimento desc;
]
Inner exception:
{"Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."}
重点是,如果我尝试单独执行这些步骤:
_recordCount= _countCriteria.GetExecutableCriteria(session).FutureValue<int>().Value;
它像沙姆一样工作!!
为什么,如果我尝试在同一个statemant中执行它们,我会收到此错误?
这是一个锁定问题?我也尝试在MSS管理工作室中执行相同的双查询命令,我没有错误!
答案 0 :(得分:1)
原则,你用过的未来查询对我有用。不仅在我试图重现这个问题时,甚至在每天的基础上。
我确实经历过同样的例外。这是因为有两个开放的事实。第一个,在事务中运行,是使用update / insert锁定表 - 未提交。第二个是要求结果(未来)和超时停止它。所有这些都在同一个请求中(可怕)
注意:从片段(我知道它可能只是一个快速草案,但为了以防万一,它是复制粘贴),我不确定命名约定 (来自外部作用域的
criteria
是DAO的_recordCount
成员 class,因为'var _pageCriteriaFuture'绝对是本地的 变量,前缀为_
。_countCriteria
出现在。{1}}中 没有初始化的片段......
这一切都意味着,每个部分都是分开的,其中一些部分可能已经触发了另一个部分的开放/关闭。所以我建议,打开log4net和NHIberante的完整日志记录,并在事务打开时检查。可能有答案。