2012-04-13 85 views
-3

我已经实现了一个JDBC连接池来获取和关闭我的数据访问对象的连接,以便使用java存储和检索来自mysql数据库的数据。使用连接池在mysql数据库中记录log4j

我还希望通过名为JDBCAppender的appender将名为log4j的库存储在数据库中的主要操作和异常。

在使用连接池之前,事件的记录没有问题,因为一次只有一个连接被用于操作。既然连接同时被从池中抓取并交还给池,那么一旦一个连接(第一个连接)被关闭,记录器似乎不知道如何获得另一个连接。

如何登录到具有连接池的数据库?

我已经调查了这个我自己,我需要做的就是覆盖JDBCAppender.java中的getConnection()方法(它在apache log4j 1.2.16库中)......但我有两个问题。

我需要在LOG4J 1.2.16 jar文件中有我的连接池实现类吗? 说如果我从池中获取连接,我该如何将LOG4J 1.2.16 Java文件重新编译为jar文件?

随着到目前为止,我可以用我的连接池的实现和JDBCAppender Java类提供,我们可以从那里您已经阅读......

+0

@duffymo,我为帽大锁表示歉意,我并不是故意粗鲁的先生。而我正在努力这就是为什么我寻求帮助,我知道我很接近,我正在努力使一些工作:S ... – Becks 2012-04-13 01:13:05

+0

请参阅此链接[http://logging.apache.org/log4j/ 1.2/apidocs/org/apache/log4j/jdbc/JDBCAppender.html]以查看针对此问题的解决方案的建议...谢谢 – Becks 2012-04-13 01:14:28

+0

至于链接,您是否说过您已尝试过该链接并没有得到预期的结果? – duffymo 2012-04-13 01:15:55

回答

3

首先回答您的具体问题:没有需要您的连接池类位于Log4J JAR中。您只需在运行代码时在CLASSPATH中包含所有类和JAR文件。 CLASSPATH将拿起一切。所以这不是你问题的原因。

我无法从您的问题与后来的一些评论中分辨出您是使用自己的连接池还是第三方连接池。如果是前者,则应该切换到第三方池,如DBCP,C3P0BoneCP。如果是后者,那么你的问题可能是由你配置池的方式引起的。它绝对与JAR无关,这些都在你的CLASSPATH中,不需要组合或混合或类似的东西。

我看了javadoc for JDBCAppender,发现了一些东西。首先,确保你覆盖了closeConnection(),而不仅仅是openConnection()。接下来,我注意到一个警告,这个类可能会在将来被更改,也不会记录异常。

因此,您可能还想使用LogBack而不是Log4J。它是由同一作者代表的新技术。它的DBAppender似乎支持异常记录,并且允许您插入Connection源文件,而不是覆盖getConnection()

+0

谢谢你的澄清先生。我正在使用Apache DBCP的连接池实现。 JDBCAppender的javadoc建议使用JDBCAppender.java作为基类,以实现从池中雇佣的连接。这是否意味着我需要创建另一个扩展JDBCApender的类,但它调用MyConnPool.getConnection()和MyConnPool.close()而不是JDCBAppender的getConnection()和close()?在log4j-1.2.16.jar \ org \ apache \ log4j \ jdbc中的log4j 1.2.16.jar中,我看到一个JDBCAppender.class,需要我重新编译? .. – Becks 2012-04-14 13:03:00

+0

JDBCAppender是为了让用户将它分类而写的(http://mail-archives.apache.org/mod_mbox/logging-log4j-user/200111.mbox/%[email protected]%3E )。您不需要重新编译Log4J JAR。只需使用您描述的getConnection()和closeConnection()方法创建JDBCAppender的子类,然后在log4j配置中将该新类指定为appender。我也发现[这个关于配置JDBCAppender的文档](http://www.tutorialspoint.com/log4j/log4j_logging_database.htm);它的一切都应该适用于你的子类。 – 2012-04-14 23:50:10

+0

你说什么是有道理的先生,但我不明白配置文件将如何“理解”新的appender。我的DBCP连接池实现是这个[ConnectionProvider](http://pastebin.com/b1uvqFcx)。我的log4j.properties是[log4j.properties](http://pastebin.com/Pkc161f1)。我的问题是,如何使用连接池类的getConnection()和closeConnection()来说'NewJDBCAppender.java'? ...为了使NEW JDBCAppender正常工作,我应该在log4j.properties文件中更改哪些内容? ...谢谢先生... – Becks 2012-04-16 00:12:35