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

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

【问题讨论】:

    标签: log4j


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2011-03-26
      相关资源
      最近更新 更多