Java 我的tomcat启动时出现了明显的死锁

Java 我的tomcat启动时出现了明显的死锁,java,tomcat,c3p0,Java,Tomcat,C3p0,当我用tomcat或resin启动我的项目时,我的项目将抛出错误:明显的死锁 我认为c3p0导致的错误无法连接我的数据库,我更改了我的xml并用数据库的ip替换域名,然后项目启动 在我的c3p0工作之前,我使用了一个侦听器,我可以得到正确的域名和ip,我找不到明显死锁的原因 012-10-22 16:53:04 24344 WARN [Timer-0] com.mchange.v2.async.ThreadPoolAsynchronousRunner:624 - com.mchange.

当我用tomcat或resin启动我的项目时,我的项目将抛出错误:明显的死锁

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

在我的c3p0工作之前,我使用了一个侦听器,我可以得到正确的域名和ip,我找不到明显死锁的原因

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)

如文档:配置语句池部分所述

如果语句CacheNumDeferredCloseThreads大于零,则 语句池将延迟缓存语句的物理关闭() 直到其父连接未被任何客户端或内部使用 (例如,在测试中)由池本身进行。对于某些JDBC驱动程序(尤其是 Oracle),如果父连接 正在使用中。此参数默认为0。如果需要,请将其设置为正值 您观察到与连接关闭任务相关的“明显死锁”。 几乎总是,这个值应该是一:如果你需要不止一个 专门用于语句销毁的线程,您可能应该 将maxStatements和/或maxStatementsPerConnection设置为更高的值 因此,您不会如此快速地浏览缓存语句


听起来您已经找到了原因:您遇到了DNS问题,因此尝试通过名称挂起查找您的数据库,而通过IP连接到您的数据库是可以的。您看到的c3p0消息表明从数据库获取连接的尝试处于挂起状态(即,在异常情况下既不成功也不失败)。最终,这些挂起了tasak的线程池,您会看到明显的死锁警告

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


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

您使用的是什么数据库?Oracle?“如果可以按名称查找数据库服务器”。我该怎么做?有人能帮我吗?