使用NHibernate在多标准/未来的TimeOut异常

时间:2013-06-05 15:33:15

标签: c# asp.net sql-server nhibernate

我在使用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管理工作室中执行相同的双查询命令,我没有错误!

1 个答案:

答案 0 :(得分:1)

原则,你用过的未来查询对我有用。不仅在我试图重现这个问题时,甚至在每天的基础上。

我确实经历过同样的例外。这是因为有两个开放的事实。第一个,在事务中运行,是使用update / insert锁定表 - 未提交。第二个是要求结果(未来)和超时停止它。所有这些都在同一个请求中(可怕)

  

注意:从片段(我知道它可能只是一个快速草案,但为了以防万一,它是复制粘贴),我不确定命名约定   (来自外部作用域的criteria是DAO的_recordCount成员   class,因为'var _pageCriteriaFuture'绝对是本地的   变量,前缀为__countCriteria出现在。{1}}中   没有初始化的片段......

这一切都意味着,每个部分都是分开的,其中一些部分可能已经触发了另一个部分的开放/关闭。所以我建议,打开log4net和NHIberante的完整日志记录,并在事务打开时检查。可能有答案。