我已经从JDBC实现了一个连接池来获取和关闭我的数据访问对象的连接,以便使用java存储和检索来自mysql数据库的数据。
我还想通过名为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 :(得分:3)
首先,回答您的具体问题:您的连接池类不需要在Log4J JAR
中。您只需在运行代码时在JAR
中拥有所有类和CLASSPATH
个文件。 CLASSPATH
将获取所有内容。所以这不是你问题的原因。
无论您使用的是自己的连接池还是第三方连接池,我都无法通过您的问题和后来的评论来判断。如果是前者,您绝对应该切换到第三方池,例如DBCP,C3P0或BoneCP。如果是后者,那么您的问题可能是由您配置池的方式引起的。它绝对与JAR
无关,它们都在你的CLASSPATH
中,不需要组合或混合或类似的东西。
我读了javadoc for JDBCAppender并注意到了一些事情。首先,请确保覆盖closeConnection()
,而不仅仅是openConnection()
。接下来,我注意到一个警告,即将来可能会更改此类,并且不会记录异常。
出于这个原因,您可能还想使用LogBack而不是Log4J。它由同一作者代表并代表更新的技术。其DBAppender似乎支持记录异常,还允许您插入Connection
来源,而不是覆盖getConnection()
。