当我通过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)
答案 0 :(得分:4)
听起来你找到了原因:你遇到了DNS问题,因此尝试按名称查找数据库时会挂起,而通过IP连接到数据库则没问题。您看到的c3p0消息表明从数据库获取Connections的尝试是挂起的(即,既没有成功也没有失败的异常)。最终那些挂起的排气c3p0的线程池,你看到APPARENT DEADLOCK警告。
当您看到与语句相关的任务导致死锁时,user1516873(statementCacheNumDeferredCloseThreads)建议的设置很有用,但在您的情况下不太可能有用。您将暂停池尝试从数据库中获取Connections。
您应该做的主要是在您的网络应用服务器上调试DNS问题。尝试使用nslookup或dig之类的工具,看看你是否可以按名称查找数据库服务器,以及结果是否及时结束或是否在查找中挂起。根据你的描述,你很可能会在那里发现问题。
答案 1 :(得分:1)
如文档中所述:http://www.mchange.com/projects/c3p0/,配置语句池
部分如果 statementCacheNumDeferredCloseThreads 大于零,则 语句池将推迟物理关闭()缓存语句 直到其父Connection未被任何客户端或内部使用 (在例如测试中)由池本身。对于某些JDBC驱动程序(尤其是 Oracle),如果父连接尝试关闭一个Statement冻结 正在使用中。此参数默认为0.如果,则将其设置为正值 您观察到“APPARENT DEADLOCKS”对Connection close任务进行了实践。 几乎总是,这个值应该是一个:如果你需要不止一个 线程专门用于声明破坏,你可能应该 将maxStatements和/或maxStatementsPerConnection设置为更高的值 所以你不要这么快就通过缓存的语句流失。