LOG4J强大的功能让我爱不释手,为了不用跑到机房看日志,我打算把日志写入远程数据库,这样操作起来就方便了,同时又可以按时间、按关键词搜索,一举两得。
LOG4J提花了一个JDBCAppender的远程数据库输出方案,使用也很简单,在配置文件里写好驱动名、URL及远程数据库的登陆账号、密码,再加一个布局&SQL语句全部搞定,真当是方便极了。在我本机上测试没有问题,但欢天喜地移植到服务器上问题就来了,发现每次数据库连接特别慢,严重影响了程序的正常运行,这还得了,赶紧恢复到原来的状态,思索如何改进。
了解它的原理之后,问题的关键部分就很清楚了,JDBCAppender在向远程数据库写日志时,用的是短连接,虽然定义了一个BufferSize,但好像不起什么作用,这就相当于每次写日志都要重新建立一次数据连接,而建连接往往最耗时间的啦,能不能把我原来写的数据库连接池和LOG4J和JDBCAppender结合起来使用呢?
大的方向应该是没有问题,也搜索了一下别人实现的数据库连接池,但总觉得不是很满意,还是用自己的连接池放心。如何扩展原来的JDBCAppender、把数据库连接池传递进去,一开始没有搞明白,想了老半天,后来终于整明白了。我只需要继承原来的JDBCAppender,把getConnection()和closeConnection()两个方法重写即可,其它的都不用变,示例如下:
package
com.gftech.log4j;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import org.apache.log4j.jdbc.JDBCAppender;
import com.gftech.common.GFConn;
import com.gftech.common.GFDB;
public class JDBCExtAppender extends JDBCAppender ... {
protected String driver;
public static GFDB gfdb;
private ArrayList<GFConn> tempList;
public JDBCExtAppender() ...{
super();
tempList = new ArrayList<GFConn>();
}
/** *//**
* Override this to return the connection to a pool, or to clean up the
* resource.
*
* The default behavior holds a single connection open until the appender is
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import org.apache.log4j.jdbc.JDBCAppender;
import com.gftech.common.GFConn;
import com.gftech.common.GFDB;
public class JDBCExtAppender extends JDBCAppender ... {
protected String driver;
public static GFDB gfdb;
private ArrayList<GFConn> tempList;
public JDBCExtAppender() ...{
super();
tempList = new ArrayList<GFConn>();
}
/** *//**
* Override this to return the connection to a pool, or to clean up the
* resource.
*
* The default behavior holds a single connection open until the appender is