0

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

この長時間実行されているプロセスが完了するまでに1時間以上かかり、コードが別のページにリダイレクトされるたびに、接続が失われたことを通知するORA-03135(接続が失われた連絡先)が表示されるため、この別のページには次のアクティブなものがあります。レコードクエリ:

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

その後、ora-03135を返します

だから私は、長時間実行されるプロセスの前に閉じなかったactiverecordからの接続ができないかどうかを考えていました

この長時間実行されるプロセスは、文字通り、アプリケーションによって開始される別のプロセスであり、終了するのを待ってから別のページにリダイレクトするため、他のプロセスがアクティブなレコードを使用している場合でも、同じ接続文字列などは使用されません。

まったく別のテーブルで新しいクエリを開始しているので面白いですが、activerecordはタイムアウトした既存の接続を再利用しようとしていますか?「Pooling=False」と「ValidateConnection=true」を追加しようとしましたがうまくいきませんでした

前もって感謝します

4

1 に答える 1

1

セッションが破棄されると接続が閉じられます。これが発生する場所は、アプリケーションによって異なります。ActiveRecordに付属のモジュールを使用している場合は、Application.EndRequestイベントが発生したときに(つまり、リクエストの最後に)発生します。発生していない場合は、SessionScopeまたはTransactionScopeがどこにあるかを確認する必要があります。作成および破棄されます(破棄は接続が閉じられる場所です)。

長時間実行されるタスクを開始し、完了する前にリダイレクトする場合は、別のスレッドで開始する必要があります(たとえば、ThreadPoolまたはTasksを使用します)。また、HybridWebThreadScopeInfoを使用するようにActiveRecordを構成して、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 に答える