Oracle 当activerecord关闭连接时

Oracle 当activerecord关闭连接时,oracle,nhibernate,activerecord,castle-activerecord,Oracle,Nhibernate,Activerecord,Castle Activerecord,在我开始使用castle activerecord的同时,我也开始使用nhibernate,所以有时我会问一些混淆的问题 我想知道当以下代码运行时activerecord(或nhibernate)何时关闭连接: Dim entity = TABLE_Y.TryFind(id) if not entity is nothing then 'long running process here response.redirect("...") end if 我这样问是因为这个长时间运

在我开始使用castle activerecord的同时,我也开始使用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没有关闭任何连接的话

这个长时间运行的进程实际上是由应用程序启动的另一个进程,它在重定向到另一个页面之前等待它结束,因此即使另一个进程使用活动记录,它也不会使用相同的连接字符串或其他任何东西

有趣的是,我在一个完全不同的表上启动了一个新的查询,activerecord是否试图重用一个超时的现有连接?我尝试添加“Pooling=False”和“Validate Connection=true”,但没有成功


提前感谢

会话结束后,连接将关闭,具体情况取决于您的应用程序。如果您使用的是ActiveRecord附带的模块,则当Application.EndRequest事件触发时(即在请求结束时)会发生此情况;如果您没有,则需要查看SessionScope或TransactionScope的创建和释放位置(dispose是连接关闭的位置)

如果您想启动一个长时间运行的任务并在它完成之前重定向,您需要在另一个线程中启动它(例如,使用线程池或任务)。您还需要将ActiveRecord配置为使用HybridWebThreadScopeInfo,以便在HttpContext不可用时(这将在后台线程中发生)将会话存储在本地线程中


谢谢,这正是我所期待的,目前我正在使用SessionScopeWebModule,所以我想在重定向时,连接不可能保持打开状态
<activerecord threadinfotype="Castle.ActiveRecord.Framework.Scopes.HybridWebThreadScopeInfo, Castle.ActiveRecord">
using(var trans = new TransactionScope()) {
   // do your stuff here...
   trans.VoteCommit();
}