7

我开发了一个 Windows 服务,我在其中使用计时器控件来执行一些计划任务。计时器超时事件每 5 分钟发生一次,其中使用 log4net appender 将日志条目添加到 Oracle 数据库。

一切正常,直到数据库服务器关闭所有连接以进行夜间冷备份。从那时起,DB 中的所有日志都将丢失,除非重新启动服务,否则即使备份过程花费不到 30 分钟,也不会记录任何内容。

从其他帖子中,我发现 log4net 仅使用一个连接,如果丢失,则所有后续日志都将被丢弃。为了解决这个问题,我开始使用在其配置中设置为 true 的 ReconnectOnError 属性。但不幸的是,问题仍然存在。备份后日志仍然丢失。我启用了跟踪并发现了以下错误,但我不知道如何解决此问题。

log4net:错误 [CustomAdoNetAppender] 写入数据库时​​出现异常 Oracle.DataAccess.Client.OracleException ORA-03113:Oracle.DataAccess.Client.OracleException.HandleErrorHelper 通信通道上的文件结尾(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure) at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src) at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery () 在 log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) 在 log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)

和:

log4net:错误 [CustomAdoNetAppender] 写入数据库时​​出现异常 System.InvalidOperationException:连接已经是 Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction 的 Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevelisolationLevel) 的本地或分布式事务的一部分(IsolationLevelisolationLevel) 在 System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction() 在 log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)

对此高度赞赏的任何帮助!

4

1 回答 1

3

我个人认为这是 log4net AdoNetAppender 中的一个错误。

在 log4net 1.2.11AdoNetAppender中犯了保持打开连接而不是使用连接池的主要罪行。

此外,ReconnectOnError 选项看起来已损坏:它仅在当前连接状态不是时才尝试重新连接ConnectionState.Open,这似乎是错误的:我不相信在出现错误时连接状态会发生变化(枚举值ConnectionState.Broken在 MSDN 中记录为为产品的未来版本保留)。

总而言之,我建议您实现自己的自定义附加程序,以正确执行连接池。这不是一个很大的类,所以很容易复制和修复。

于 2012-11-29T12:00:02.857 回答