2012-06-06 81 views
0

我開始使用NHibernate,我開始使用城堡ActiveRecord的,所以我有那些混了問題,有時當城堡的ActiveRecord關閉連接

我想知道下面的代碼運行時,當ActiveRecord的(或NHibernate的)關閉連接的同時:

Dim entity = TABLE_Y.TryFind(id) 
if not entity is nothing then 
    'long running process here 
    response.redirect("...") 
end if 

我問這是因爲這個長時間運行的過程需要一個多小時才能完成,每當代碼重定向到另一個頁面,我得到一個ORA-03135(連接失去聯繫)告訴我的連接已丟失,該另一頁具有以下活動記錄查詢:

Dim entity = TABLE_X.FindAll(Order.Desc(...), _ 
    Expression.Eq(...) And _ 
    Expression.Eq(...)).FirstOrDefault 

,然後返回ORA-03135

所以我在想,如果不能從ActiveRecord的任何連接未長時間運行的過程之前關閉

這個長期運行的進程是從字面上另一個進程由應用程序啓動,它在重定向到另一個頁面之前等待它結束,因此即使其他進程使用活動記錄,它也不會使用相同的連接字符串或任何其他進程

這很有趣,因爲我開始完整的新查詢ely不同的表格,activerecord是否試圖重用超時的現有連接?我嘗試添加「池=假」和「驗證連接=真」,沒有運氣

在此先感謝

回答

1

當會話配置的,在這種情況發生的連接將被關閉,取決於你的應用。如果您使用的是ActiveRecord附帶的模塊,那麼在Application.EndRequest事件觸發時(即在請求結束時)會發生,如果不是,那麼您需要查看SessionScope或TransactionScope的位置是創建和處理(處理是連接關閉的地方)。

如果你想開始一個長時間運行的任務並在它完成之前重定向,你將需要在另一個線程中啓動它(例如使用ThreadPool或Tasks)。您還需要將ActiveRecord配置爲使用HybridWebThreadScopeInfo,以便在HttpContext不可用(這將在後臺線程中發生的情況)時將會話存儲在本地線程中。

<activerecord threadinfotype="Castle.ActiveRecord.Framework.Scopes.HybridWebThreadScopeInfo, Castle.ActiveRecord"> 
在你的任務

然後,在一個TransactionScope或SessionScope包起來(我更喜歡前者):

using(var trans = new TransactionScope()) { 
    // do your stuff here... 
    trans.VoteCommit(); 
} 
+0

感謝,這正是我所期待的,我目前使用的SessionScopeWebModule所以沒有方式連接將保持打開,同時重定向我想 –

+0

更新回答您的情況 –

相關問題