c3p0池连接幻像连接

时间:2016-03-21 20:28:28

标签: tomcat jdbc jndi c3p0

我在Tomcat7上运行一个应用程序,c3p0作为数据源池管理器。我添加了一个连接定制器来记录每个数据源Acquired / check out / in。

我的日志(catalina.out)包含许多条目:

获得com.cloudera.impala.jdbc41.ImpalaJDBC41Connection@e5059be [z8kfsx9f16wfz9m1p2ghf4 | 729e8277] 获得com.cloudera.impala.jdbc41.ImpalaJDBC41Connection@217a2a9 [z8kfsx9f16wfz9m1p2ghf4 | 729e8277] 检入com.cloudera.impala.jdbc41.ImpalaJDBC41Connection@e5059be 检查出com.cloudera.impala.jdbc41.ImpalaJDBC41Connection@e5059be

我还注意到了许多sql异常,例如:

java.sql.SQLException:关闭com.mchange.v2.c3p0.impl.NewPooledConnection@6c5ca37c时,某些资源无法正常关闭         在com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:571)         在com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234)         at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470)         在com.mchange.v2.resourcepool.BasicResourcePool $ 1DestroyResourceTask.run(BasicResourcePool.java:964)         在com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

当我在日志文件中搜索“6c5ca37c”时,我看不到任何指示何时获取连接的行。解析日志向我显示所有“已获取”的连接,其中“已销毁”成功,但所有与sql异常一起显示的连接都没有任何相应的获取行

任何见解都会有所帮助。

1 个答案:

答案 0 :(得分:0)

很抱歉反应迟钝。我最近一直在外面。

com.mchange.v2.c3p0.impl.NewPooledConnection是与com.cloudera.impala.jdbc41.ImpalaJDBC41Connection不同的对象。第一个包装和第二个实例,但它们不具有一致的标识哈希码值(它成为默认toString()方法的十六进制部分)。

你自己看到的异常并不太令人担忧。 c3p0对于关闭事物非常神经质,如果不确定ResultSetStatementclose(),它会尝试close()它们。如果他们已经以某种方式失效,他们可能会在close()上抛出异常,从而导致此消息。

我会检查日志中的其他位置(在此堆栈跟踪之前),以查看在关闭异常之前是否出现其他问题,这可能更令人担忧。如果存在先前的问题,那可能会提供更多信息。如果可以的话,我会确保应用程序对close() ResultSet和语句非常谨慎。否则,如果应用程序执行正常,我不会非常担心这些偶然的消息。在尝试关闭可能对该连接保持打开状态的每个资源之后,c3p0将调用close()到您的Connection。尝试close()辅助资源的例外不会阻止c3p0对Connection进行最佳尝试close(),所以除非在JDBC端严重破坏(conn.close()失败),否则将没有资源泄漏。