0

我在开始使用城堡 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”但没有成功

提前致谢

4

1 回答 1

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();
}
于 2012-06-06T17:59:56.420 回答