LOG4J向数据库中写LOG,而JDBCAppender就得要单独进立数据库连接,而写LOG的操作非常频繁,这样,如果按JDBCAppender的方法要频繁地进行连接断开数据库操作,显然,这不是最理想的。在网上有文章介绍把这个改成数据库连接池的。Hibernate现在在J2EE项目中已经应用相当广泛,下面介绍如何扩展JDBCAppender,用Hibernate的数据库连接。
查看JDBCAppender,我们可以看出,只要重载下面三个方法即可:
protected Connection getConnection() throws SQLException ;
protected void execute(String sql) throws SQLException;
protected void closeConnection(Connection con);
具体实现原码如下所示:
package com.common.util;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.log4j.spi.ErrorCode;
import org.apache.log4j.spi.LoggingEvent;
public class JDBCConnAppender extends org.apache.log4j.jdbc.JDBCAppender {
/**
* Override 此函数来返回一个hibernate的连接。
*/
protected Connection getConnection() throws SQLException {
return HibernateUtil.currentSession().connection();
}
/**
*执行数据库操作。
*/
protected void execute(String sql) throws SQLException {
Connection con = null;
Statement stmt = null;
try {
con = getConnection();
stmt = con.createStatement();
stmt.execute(sql);
con.commit();
} catch (SQLException e) {
if (stmt != null)
stmt.close();
throw e;
}
stmt.close();
closeConnection(con);
}
/**
*关闭数据库连接。
*/
protected void closeConnection(Connection con) {
try {
if (connection != null && !connection.isClosed())
connection.close();
} catch (SQLException e) {
errorHandler.error("Error closing connection", e,
ErrorCode.GENERIC_FAILURE);
}
}
}