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
* closed (typically when garbage collected).
*/
本文介绍了如何将LOG4J的日志记录功能与数据库连接池结合,以解决JDBCAppender在远程数据库写入日志时连接慢的问题。作者通过继承JDBCAppender并重写getConnection()和closeConnection()方法,实现了使用数据库连接池来管理连接,避免了频繁的连接创建。此外,还解决了堆栈信息无法写入数据库的难题,提高了程序执行效率。
最低0.47元/天 解锁文章
991

被折叠的 条评论
为什么被折叠?



