2013-08-22 63 views
2

我有一個NHibernate的查詢(這是填充一個ExtJS網格)NHibernate.Exceptions.GenericADOException超時從代碼而不是從DB

它發射2個查詢關閉數據庫,一個得到記錄計數(尋呼機目的),另一個獲得頂部的N行來填充網格。

從代碼中,我總是在Select count(*)語句中得到一個異常。

NHibernate.Exceptions.GenericADOException: 
Failed to execute multi criteria[SQL: 
SELECT count(*) as y0_ FROM RecordView this_ inner join ProcessesView 
process1_ on this_.ProcessId=process1_.Id inner join BusinessModelsView 
businessmo3_ on process1_.BusinessModelId=businessmo3_.Id inner join BatchesView 
batch2_ on this_.BatchId=batch2_.Id WHERE this_.ProcessId = ?; 
] ---> System.Data.SqlClient.SqlException: Timeout expired. 
The timeout period elapsed prior to completion of the operation or the server 
is not responding. 

但是如果我採取確切查詢,並將其拖放到一個SSMS窗口,並運行它,則執行在< 1秒。

NHibernate是否在這裏引擎蓋下做任何「有趣」的事情。是否有執行計劃/緩存問題。我完全喪失了爲什麼會發生這種情況。

+0

需要多長時間才能獲得超時? –

+0

30秒。我們的配置連接字符串中的Sql超時值 –

回答

1

你兩個查詢不以同樣的方式由SQL Server處理

  • 你NH查詢已編制了其第一次執行,基於表的統計信息和參數的第一個值。生成的查詢計劃然後將用於所有後續調用,同時考慮參數值

  • 您的SQL查詢(其中,我猜你用一個實際值替換?)爲每個值獲取不同的編譯統計數據和價值。

你的第一個NH編譯可能產生了一個查詢計劃,對第一個值有效,但不是在一般情況下。

首先,我建議:

  • 您在投影計數(比如在主表中的id),因爲它是稍微比count(*)更有效,讓DB只在工作索引時可能
  • 你檢查你不會錯過任何必要的索引查詢
  • 您檢查您的所有表的統計信息是最新的

如果這樣仍不能提高執行時間,日是後提供了一些選項(重新編譯可能是很好的): Query executed from Nhibernate is slow, but from ADO.NET is fast

2

每當我遇到了這個錯誤,原因是鎖定從未性能)。有兩場會議開幕(意外)。兩人都開始交易,其中一人鎖定了桌子。

問題可能是一些沒有處理的會話,或「意外的」單身......舉行打開的會話。

這個答案並不像我希望的那樣直線前進,但我確信方向。因爲我經歷過同樣的(和有罪)

BTW:作爲奧斯卡·伯格倫從你發現,30個secods超時將相關<property name="command_timeout">30</property>。我相信,如果你會提供60,120 ...這將是不夠的,因爲鎖

相關問題