我的tomcat启动时C3P0 APPARENT DEADLOCK

当我通过tomcat或resin启动我的项目时,我的项目将抛出错误:APPARENT DEADLOCK

我认为由c3p0引起的错误无法连接我的数据库,我更改了我的xml并用我的数据库的ip替换了域名,然后项目启动了!

我在c3p0工作之前使用了一个监听器,我可以得到正确的域名和ip,我找不到APPARENT DEADLOCK的原因。

012-10-22 16:53:04 24344 WARN [Timer-0] com.mchange.v2.async.ThreadPoolAsynchronousRunner:624 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1e79aa -- APPARENT DEADLOCK!!! Complete Status: Managed Threads: 3 Active Threads: 3 Active Tasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@723a14 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@14313ff (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@d5f50d (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) Pending Tasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@cb560b com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@17e107c Pool thread stack traces: Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main] java.net.PlainSocketImpl.socketConnect(Native Method) java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 

听起来你找到了原因:你遇到了DNS问题,因此尝试按名称查找数据库时会挂起,而通过IP连接到数据库则没问题。 您看到的c3p0消息表明从数据库获取Connections的尝试是挂起的(即,既没有成功也没有失败的exception)。 最终那些挂起的排气c3p0的线程池,你看到APPARENT DEADLOCK警告。

当您看到与语句相关的任务导致死锁时,user1516873,statementCacheNumDeferredCloseThreads建议的设置很有用,但在您的情况下不太可能有用。 您暂停池尝试从数据库获取Connections。

您应该做的主要是调试Web应用服务器上的DNS问题。 尝试使用nslookup或dig之类的工具,看看你是否可以按名称查找数据库服务器,如果结果很快或者你在查找中挂起。 根据您的描述,您很可能会在那里发现问题。

如文档中所述: http : //www.mchange.com/projects/c3p0/ , 配置语句池

如果statementCacheNumDeferredCloseThreads大于零,则语句池将推迟物理关闭()缓存语句,直到其父连接未被任何客户端使用或池本身内部(例如测试)。 对于某些JDBC驱动程序(尤其是Oracle),如果正在使用父连接,则尝试关闭Statement冻结。 此参数默认为0.如果您观察到接近关闭”任务的“APPARENT DEADLOCKS”,则将其设置为正值。 几乎总是,该值应该是一个:如果您需要多个专用于Statement销毁的Thread,您可能应该将maxStatements和/或maxStatementsPerConnection设置为更高的值,这样您就不会如此快速地通过缓存语句进行流失。