6

当我通过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)
4

2 回答 2

4

听起来您已经找到了原因:您遇到了 DNS 问题,因此尝试按名称查找数据库挂起,而通过 IP 连接到您的数据库很好。您看到的 c3p0 消息表明从数据库获取连接的尝试正在挂起(即,既没有成功也没有失败并出现异常)。最终,那些挂起的 tasak 耗尽了 c3p0 的线程池,您会看到明显的死锁警告。

user1516873 建议的设置 statementCacheNumDeferredCloseThreads 在您看到与 Statement 相关的任务导致死锁时很有用,但对您的情况不太可能有帮助。您正在等待池尝试从数据库获取连接。

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

于 2012-10-22T12:05:00.653 回答
1

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

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

于 2012-10-22T09:23:41.873 回答