3

在我的C#.NET 3.5應用程序中,我通過NHibernate使用CastleProject ActiveRecord。這是使用MS SQL Server 2008中我已經設置ADO命令超時爲0,以防止超時異常期間批量操作的桌面應用程序:當超時設置爲無限時間時發生超時異常

<activerecord> 
    <config> 
     ... 
     <add key="hibernate.command_timeout" value="0" /> 
    </config> 
    </activerecord> 

    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     ... 
     <property name="command_timeout">0</property> 
    </session-factory> 
    </hibernate-configuration> 

不過,我仍然收到超時異常! NHibernate的日誌顯示是這樣的:

某處開頭:

2010-10-02 06:29:47746信息 NHibernate.Driver.DriverBase - ADO.NET命令超時設置爲0秒

某處底:

2010-10-02 07:36:03020 DEBUG NHibernate.AdoNet.AbstractBatcher - 封閉IDbCommand的,開放的IDbCommand S: 0 2010-10-02 07:36:03382 ERROR NHibernate.Event.Default.AbstractFlushingEventListener - 與會話 NHibernate.HibernateException未能進行SYN chronize數據庫狀態:在執行時發生 例外 批查詢---> System.Data.S qlClient.SqlException:超時 已過期。在完成操作 之前已經超時了 或者服務器沒有響應。在 System.Data.SqlClient.SqlConnection.OnError(SQLEXCEPTION 例外,布爾breakConnection)

怎麼來的?如何解決這個問題?

+0

一個Web應用程序,我假設? – hardba11 2010-10-02 04:56:49

+0

對不起,沒有說明這一點。不,這是常規的桌面應用程序。 – Alex 2010-10-02 05:21:00

+0

您使用批處理('adonet.batch_size'> 0)嗎?爲什麼你有一個ActiveRecord配置*和*一個單獨的NHibernate配置?什麼樣的SQL語句超時(更新/插入/選擇/刪除)?你使用的是什麼版本的NHibernate和ActiveRecord? – 2010-10-02 16:23:10

回答

5

這是正確的,值爲0表示沒有超時(如defined in the MSDN docs),但NHibernate's driver passes the config value to the db command when it's >= 0,配料機的條件checks that the value is > 0

因此,當您將批處理設置爲超時值0時,該值不會轉移到db命令,因此它仍保持爲默認值。

這完全可能是由於設計原因,NHibernate開發者有意禁用批處理場景的禁用超時。無論如何,禁用超時是一個壞主意,如果你有超時錯誤的麻煩,我會提高價值,但不禁用它。

請用NHibernate開發人員確認。

+0

謝謝,Mauricio! – Alex 2010-10-03 21:25:09

+0

我試圖增加超時時間(從1000到10000)和減少的批量大小(從1000到100),現在我得到異常NHibernate.TransactionException:事務沒有連接,或者在批量操作的相當隨機的地方斷開連接。爲什麼? – Alex 2010-10-04 06:08:25

+0

嗯......我再次得到超時異常,對於如此長的超時值是不可能的。我的一個朋友說我使用的Nhibernate TransactionScope不使用自定義超時。你知道任何解決方法來填充從配置文件到TransactionScope的超時嗎? – Alex 2010-10-04 07:42:00