我在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异常一起显示的连接都没有任何相应的获取行
任何见解都会有所帮助。
答案 0 :(得分:0)
很抱歉反应迟钝。我最近一直在外面。
com.mchange.v2.c3p0.impl.NewPooledConnection
是与com.cloudera.impala.jdbc41.ImpalaJDBC41Connection
不同的对象。第一个包装和第二个实例,但它们不具有一致的标识哈希码值(它成为默认toString()
方法的十六进制部分)。
你自己看到的异常并不太令人担忧。 c3p0对于关闭事物非常神经质,如果不确定ResultSet
或Statement
是close()
,它会尝试close()
它们。如果他们已经以某种方式失效,他们可能会在close()
上抛出异常,从而导致此消息。
我会检查日志中的其他位置(在此堆栈跟踪之前),以查看在关闭异常之前是否出现其他问题,这可能更令人担忧。如果存在先前的问题,那可能会提供更多信息。如果可以的话,我会确保应用程序对close()
ResultSet和语句非常谨慎。否则,如果应用程序执行正常,我不会非常担心这些偶然的消息。在尝试关闭可能对该连接保持打开状态的每个资源之后,c3p0将调用close()到您的Connection。尝试close()辅助资源的例外不会阻止c3p0对Connection进行最佳尝试close(),所以除非在JDBC端严重破坏(conn.close()
失败),否则将没有资源泄漏。