当castle activerecord关闭连接时

时间:2012-06-06 14:50:12

标签: oracle nhibernate 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

我问这个是因为这个长时间运行的过程需要一个多小时才能完成,每当代码重定向到另一个页面时,我得到一个ORA-03135(连接失去联系),告诉我连接丢失,这个其他页面有以下活动记录查询:

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

然后返回ora-03135

所以我在想,如果没有来自activerecord的任何连接,那么在长时间运行的过程之前没有关闭

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

这很有趣,因为我在一个完全不同的表上开始一个新查询,是否正在尝试重用已超时的现有连接?我试图添加“Pooling = False”和“Validate Connection = true”,但没有运气

提前致谢

1 个答案:

答案 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();
}