log4net Adonet Appender连接问题
我开发了一个Windows服务,我正在使用一个计时器控件来执行一些计划任务。 定时器过期事件每5分钟发生一次,其中使用log4net appender向Oracle数据库创建日志条目。
所有工作都正常,直到数据库服务器关闭夜间冷备份的所有连接。 从那时起,所有DB中的日志都会丢失,并且不记录任何内容,除非服务重新启动,即使备份过程少于30分钟。
从其他帖子我发现,log4net只使用一个连接,如果丢失,则所有后续日志都将被丢弃。 为了弥补这一点,我开始在其配置中使用ReconnectOnError属性集作为true。 但不幸的是,这个问题仍然存在。 备份后日志仍然丢失。 我启用了跟踪并发现了以下错误,但我不知道如何解决此问题。
log4net:ERROR [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 procedure,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src)在Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery上的OpoSqlValCtx * pOpoSqlValCtx,Object src, ()在log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran,LoggingEvent []事件)在log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent []事件)
和:
log4net:ERROR [CustomAdoNetAppender]写入数据库时发生异常System.InvalidOperationException:连接已经是Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel)上本地或分布式事务的一部分,位于Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction (IsolationLevel isolationLevel)在System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction()在log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent []事件)
任何帮助,高度赞赏!
就我个人而言,我认为这是log4net AdoNetAppender中的一个错误。
在log4net 1.2.11中, AdoNetAppender
承诺保持开放连接而不是使用连接池。
此外ReconnectOnError选项看起来破损:它只尝试重新连接,如果当前连接状态不是ConnectionState.Open
,这似乎是错误的:我不相信连接状态在出现错误时发生更改(枚举值ConnectionState.Broken
在MSDN中记录为为未来版本的产品保留)。
总而言之,我建议您实现自己的自定义appender,以正确连接池。 这不是一个非常大的课程,所以很容易复制和修复。
链接地址: http://www.djcxy.com/p/11519.html