0

我在带有 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;

它像沙姆一样工作!

为什么,如果我尝试在同一个语句中执行它们,我会收到这个错误?

是锁的问题?我也尝试在 MSS 管理工作室中执行相同的两个查询命令,但我没有收到任何错误!

4

1 回答 1

1

原则上,您使用的 Future 查询对我有用。不仅当我试图重现这个问题时,甚至在每天的基础上。

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

注意:从片段(我知道它可能只是一个快速草稿,但以防万一,它是复制粘贴),我不确定命名约定(criteria来自外部范围,是_recordCountDAO 类的成员,因为 'var _pageCriteriaFuture' 绝对是局部变量,而前缀是_._countCriteria出现在片段中没有初始化......

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

于 2013-06-06T03:50:15.397 回答