在 log4j 中重新连接到数据库

Posted

技术标签:

【中文标题】在 log4j 中重新连接到数据库【英文标题】:Reconnect to DB within log4j 【发布时间】:2010-10-07 09:57:34 【问题描述】:

如果我将 JDBCAppender 配置为向 mysql 抛出日志消息 而且,当我的系统启动时,我重新启动数据库,它是否重新连接到数据库?

【问题讨论】:

【参考方案1】:

我在上周末遇到了这个用例。我的数据库由 Amazon AWS 托管。它翻转了我的日志数据库,并且所有通过 Log4j JDBC Appender 记录到该数据库的实例都停止了记录。我退回了其中一个应用程序,它恢复了日志记录。

因此,根据经验,这个问题的答案似乎是

如果数据库出现故障并重新联机,则 JDBC 附加程序不会自动重新连接。

编辑

JDBCAppender getConnection 可能会被覆盖以修复。

【讨论】:

也许覆盖getConnection() 以确保连接有效。如果没有创建一个新的连接。【参考方案2】:

log4j 1.2.15 中的 JDBCAppender 有以下代码

protected Connection getConnection() throws SQLException 
      if (!DriverManager.getDrivers().hasMoreElements())
         setDriver("sun.jdbc.odbc.JdbcOdbcDriver");

      if (connection == null) 
        connection = DriverManager.getConnection(databaseURL, databaseUser,
                    databasePassword);
      

      return connection;
  

因此,如果连接不为空,但已断开(需要重新连接),log4j 将向其逻辑返回断开的连接,执行记录到 db 的语句将失败。

不是解决方法,但正确的解决方案是将 log4j 替换为 logback:请参阅相关答案:Log to a database using log4j

【讨论】:

以上是关于在 log4j 中重新连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 py4j 在 java/python 项目中将 Log4j 连接到 ipython notebook stderr

使用py4j将Log4j连接到java / python项目中的ipython notebook stderr

MySQL Workbench:“MySQL 服务器已消失”时重新连接到数据库?

如何让 Spring Boot 自动重新连接到 PostgreSQL?

Azure数据工作室不会重新连接到本地托管的数据库

UCanAccess - 使用 keepMirror 后无法重新连接到 Access 数据库