c3p0 池化连接幻象连接

c3p0 Pooled Connections Phantom connections

我 运行 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) 在 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 异常的所有连接都没有任何相应的已获取行

任何见解都会有所帮助。

抱歉回复缓慢。我最近一直没上网。

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

就其本身而言,您所看到的异常并不太令人担忧。 c3p0 对关闭事物非常敏感,如果不确定 ResultSetStatement 是否已被 close()ed,它会尝试 close() 它们。如果它们已经以某种方式失效,它们可能会在 close() 上抛出异常,从而导致此消息。

我会检查日志中的其他地方(在此堆栈跟踪之前),看看在关闭异常之前是否有其他问题可能更令人担忧。如果有先前的问题,那可能会提供更多信息。如果可以,我会确保应用程序对 close() 结果集和语句非常小心。否则,如果应用程序运行正常,我就不会太担心这些偶尔出现的消息。在 c3p0 尝试关闭可能为该连接保持打开状态的每个资源之后,c3p0 将调用 close() 到您的连接。附属资源尝试关闭()的异常不会阻止 c3p0 对连接进行最佳尝试关闭(),因此除非 JDBC 端出现严重损坏(conn.close() 失败),不会有资源泄漏。