2012-11-29 88 views
7

我開發了一個Windows服務,其中我使用計時器控件執行一些計劃任務。定時器過期事件每5分鐘發生一次,其中使用log4net appender向Oracle數據庫創建日誌條目。log4net Adonet Appender連接問題

所有工作正常,直到數據庫服務器關閉夜間冷備份的所有連接。從那時起,所有DB中的日誌都會丟失,並且不記錄任何內容,除非服務重新啓動,即使備份過程少於30分鐘。

從其他帖子我發現,log4net只使用一個連接,如果丟失,則所有後續日誌都將被丟棄。爲了彌補這一點,我開始在其配置中使用ReconnectOnError屬性集作爲true。但不幸的是,這個問題仍然存在。備份後日志仍然丟失。我啓用了跟蹤並發現了以下錯誤,但我不知道如何解決此問題。

log4net的:ERROR [CustomAdoNetAppender]異常當寫入到數據庫 Oracle.DataAccess.Client.OracleException ORA-03113:在Oracle.DataAccess.Client.OracleException.HandleErrorHelper上通信信道文件結束-(的Int32 ERRCODE ,康涅狄格州的OracleConnection,IntPtr的opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,對象的src,字符串過程) 在Oracle.DataAccess.Client.OracleException.HandleError(的Int32 ERRCODE,康涅狄格州的OracleConnection,字符串過程,IntPtr的opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,對象SRC) 在Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran,LoggingEvent [] events) log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent所[]事件)

和:

log4net的:ERROR [CustomAdoNetAppender]異常當寫入到數據庫 System.InvalidOperationException:連接已經是部分本地或分佈式事務 at Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel) at Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction(IsolationLevel isolationLevel) at System.Data.Common.DbConnection.System.Data。 IDbConnection.BeginT ransaction() 在log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent所[]事件)

任何幫助在此高度讚賞!!

回答

3

我個人認爲這是log4net AdoNetAppender中的一個bug。

在log4net 1.2.11中AdoNetAppender承諾保持開放連接而不是使用連接池的主要罪過。

此外ReconnectOnError選項看起來壞了:它只嘗試重新連接,如果當前連接狀態不是ConnectionState.Open,這似乎是錯誤的:我不相信當出現錯誤時連接狀態改變(枚舉值ConnectionState.Broken在MSDN中記錄爲爲未來版本的產品保留)。

總而言之,我建議您實現自己的自定義appender,它可以正確連接池。這不是一個非常大的課程,所以很容易複製和修復。

+0

感謝您的回覆。是否有可能在某處或在自定義Appender中捕獲log4net異常? – Lucky