【发布时间】:2010-10-07 09:57:34
【问题描述】:
如果我将 JDBCAppender 配置为向 MySQL 抛出日志消息 而且,当我的系统启动时,我重新启动数据库,它是否重新连接到数据库?
【问题讨论】:
标签: log4j
如果我将 JDBCAppender 配置为向 MySQL 抛出日志消息 而且,当我的系统启动时,我重新启动数据库,它是否重新连接到数据库?
【问题讨论】:
标签: log4j
我在上周末遇到了这个用例。我的数据库由 Amazon AWS 托管。它翻转了我的日志数据库,并且所有通过 Log4j JDBC Appender 记录到该数据库的实例都停止了记录。我退回了其中一个应用程序,它恢复了日志记录。
因此,根据经验,这个问题的答案似乎是否。
如果数据库出现故障并重新联机,则 JDBC 附加程序不会自动重新连接。
编辑
JDBCAppender getConnection 可能会被覆盖以修复。
【讨论】:
getConnection() 以确保连接有效。如果没有创建一个新的连接。
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
【讨论】: