【问题标题】:log4net - How to reestablish connection to database after connection has been brokenlog4net - 连接断开后如何重新建立与数据库的连接
【发布时间】:2017-06-27 14:58:11
【问题描述】:

我在我的 WebAPI 应用程序中使用 log4net 的 AdoNetAppender。每隔几周,记录器就会突然停止记录,只有在我重新启动 Web 服务后,它才会再次开始记录。 我在 appender 中添加了一个实现 IErrorHandler 的自定义 ErrorHandler,以便捕获任何异常,如下所示:

public class MyErrorHandler : IErrorHandler
{
    private AdoNetAppender ParentAppender { get; set; }
    public MyErrorHandler(AdoNetAppender parentAppender)
    {
        ParentAppender = parentAppender;
    }
    public void Error(string message)
    {
        Debug.WriteLine(message);
    }

    public void Error(string message, Exception ex)
    {
        Debug.WriteLine(message + " ,Exception:" + ex.ToString());
    }

    public void Error(string message, Exception ex, ErrorCode errorCode)
    {

    }
}

,这些是我得到的消息和异常:

Exception while writing to database

System.InvalidOperationException: The requested operation cannot be completed because the connection has been broken.
   at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName, Boolean shouldReconnect)
   at System.Data.SqlClient.SqlConnection.BeginTransaction(IsolationLevel iso, String transactionName)
   at System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel isolationLevel)
   at System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction()
   at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)

我已经在 appender 中将 ReconnectOnError 属性设置为 true,但它不会使其重新连接。 如何使附加程序重新建立与数据库的连接,或者如何重新初始化附加程序?顺便说一句,我将 appender 传递给 ErrorHandler,所以当我捕获异常时我可以访问它。

【问题讨论】:

  • 你能发布你的appender配置吗?这里有一个答案:stackoverflow.com/a/38333737/5850144 谈到将 ConnectRetryCount=0 添加到您的连接字符串。你试过吗?
  • 谢谢!这样就解决了。

标签: c# sql-server log4net


【解决方案1】:

我按照tattarrattathttps://stackoverflow.com/a/38333737/5850144 的建议将 ConnectRetryCount=0 添加到我的连接字符串中解决了这个问题。根据MSDN,ConnectRetryCount 是

识别出空闲连接失败后尝试重新连接的次数。

设置为 0 以禁用在空闲连接失败时重新连接

所以我的猜测是,通过将此设置为 0,SqlClient 不会尝试重新连接,而是 log4net 本身会尝试重新连接(因为我将 ReconnectOnError 属性设置为 true)。

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多