7

タイマー コントロールを使用していくつかのスケジュールされたタスクを実行する Windows サービスを開発しました。タイマー経過イベントは 5 分ごとに発生し、log4net アペンダーを使用して Oracle データベースにログ エントリが作成されます。

DB サーバーが夜間のコールド バックアップのすべての接続を閉じるまで、すべて正常に動作します。それ以来、DB 内のすべてのログが失われ、バックアップ プロセスに 30 分もかからないにもかかわらず、サービスが再起動されない限り何もログに記録されません。

他の投稿から、log4net は 1 つの接続のみを使用し、失われた場合は後続のすべてのログが破棄されることがわかりました。これを改善するために、構成で ReconnectOnError 属性を true に設定して使い始めました。しかし、残念ながら、問題はまだ残っています。バックアップ後もログは失われます。トレースを有効にしたところ、次のエラーが見つかりましたが、この問題を解決する方法がわかりません。

log4net:エラー [CustomAdoNetAppender] 例外がデータベースに書き込み中 Oracle.DataAccess.Client.OracleException ORA-03113: Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode、OracleConnection conn、String プロシージャ、IntPtr opsErrCtx、OpoSqlValCtx* pOpoSqlValCtx、Object src) で Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery () log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran、LoggingEvent[] イベント) で log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] イベント) で

と:

log4net:エラー [CustomAdoNetAppender] 例外がデータベースへの書き込み中 System.InvalidOperationException: 接続は、Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel) at Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction で既にローカルまたは分散トランザクションの一部になっています(IsolationLevel isolationLevel) System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction() で log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] イベント)

これに関するヘルプは大歓迎です!!

4

1 に答える 1

3

個人的には、これは log4net AdoNetAppender のバグだと思います。

log4net 1.2.11AdoNetAppenderでは、接続プールを使用するのではなく、開いた接続を維持するという重大な罪を犯します。

また、 ReconnectOnError オプションは壊れているように見えます: 現在の接続状態が でない場合にのみ再接続を試みますがConnectionState.Open、これは間違っているようです: エラーが発生したときに接続状態が変化するとは思いません (列挙値ConnectionState.Brokenは MSDN で次のように文書化されています) 。製品の将来のバージョン用に予約されています)。

全体として、接続プールを適切に行う独自のカスタム アペンダーを実装することをお勧めします。それほど大きなクラスではないので、複製して修正するのは簡単です。

于 2012-11-29T12:00:02.857 に答える