微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – log4net – 连接断开后如何重新建立与数据库的连接

我在我的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重新建立与数据库的连接,或者如何重新初始化appender?顺便说一句,我将appender传递给ErrorHandler,所以当我捕获异常时我可以访问它.

解决方法

我通过在 tattarrattathttps://stackoverflow.com/a/38333737/5850144建议的连接字符串中添加ConnectRetryCount = 0来解决这个问题.根据 MSDN,ConnectRetryCount是

The number of reconnections attempted after identifying that there was an idle connection failure.

Set to 0 to disable reconnecting on idle connection failures

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐