我开始使用nhibernate同时开始使用城堡主动记录,所以我有时会遇到那些混淆的问题
我想知道当以下代码运行时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的任何连接,那么在长时间运行的过程之前没有关闭
这个长时间运行的进程实际上是由应用程序启动的另一个进程,它等待它在重定向到另一个页面之前结束,因此即使其他进程使用活动记录,它也不会使用相同的连接字符串或者无论如何
这很有趣,因为我在一个完全不同的表上开始一个新查询,是否正在尝试重用已超时的现有连接?我试图添加“Pooling = False”和“Validate Connection = true”,但没有运气
提前致谢
答案 0 :(得分: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();
}