Mysql C3p0明显的死锁异常
我在Tomcat日志中不断遇到此异常:Mysql C3p0明显的死锁异常,mysql,hibernate,c3p0,database-deadlocks,Mysql,Hibernate,C3p0,Database Deadlocks,我在Tomcat日志中不断遇到此异常: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1201fd18 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@408f3be4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7ba516d8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@137efe53
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@766b0524
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
java.lang.Thread.sleep(Native Method)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
java.lang.Thread.sleep(Native Method)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
java.lang.Thread.sleep(Native Method)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
我在MySQL中使用Hibernate3.6.2和C3P00.9.1.2。在谷歌搜索了几个小时后,这个明显的死锁异常似乎通常与预处理语句缓存有关。这是我在hibernate.cfg.xml中的C3P0配置:
<propertyname="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">60</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.timeout">180</property>
<property name="hibernate.c3p0.max_statements">0</property>
org.hibernate.connection.C3P0ConnectionProvider
5.
5.
60
120
180
0
我没有做任何声明。任何关于此处错误的提示都将不胜感激。正在解除锁定的任务是连接获取任务。也就是说,c3p0正在尝试从数据库获取新连接,而这些连接获取尝试需要很长时间 我要做的第一件事是升级到0.9.2.1,它改进了很多方法,可以在采集尝试有时失败的情况下执行一轮连接采集
如果这不能解决您的问题,那么您需要弄清楚为什么c3p0获取连接的尝试会挂起很长一段时间:没有成功也没有失败,只有一个例外。在我非常特殊的情况下,问题与我部署应用程序的服务器的配置有关 只有在打印出我的应用程序的堆栈跟踪后,它才被挂起,因为oracle驱动程序正在等待生成一个安全的随机数:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
java.io.FileInputStream.readBytes(Native Method)
java.io.FileInputStream.read(FileInputStream.java:255)
sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:539)
sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:144)
sun.security.provider.SecureRandom$SeederHolder.(SecureRandom.java:203)
sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:221)
java.security.SecureRandom.nextBytes(SecureRandom.java:468)
oracle.security.o5logon.O5Logon.a(Unknown Source)
oracle.security.o5logon.O5Logon.(Unknown Source)
oracle.jdbc.driver.T4CTTIoauthenticate.(T4CTTIoauthenticate.java:582)
oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)
oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:553)
oracle.jdbc.driver.T4CConnection.(T4CConnection.java:254)
oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
然后,我必须学习和理解一些关于熵噪声的知识,在Unix朋友的帮助下,我可以意识到其中一台服务器没有安装产生“噪声”的软件包
如以下帖子所述,我运行了以下命令:
cat/proc/sys/kernel/random/entropy\u avail
23
cat/proc/sys/kernel/random/poolsize
4096
因此,熵太少,无法生成安全的随机数
安装包之后
cat/proc/sys/kernel/random/entropy\u avail
4096
之后,我没有了更多明显的死锁,我的应用程序可以连接到数据库
以前遇到过类似的错误 这也可能是因为数据库服务器阻塞了您的IP。确保数据库服务器/云提供商未阻止服务器的IP
在我的例子中,我尝试使用多线程将数据插入到云中的数据库中,它只在本地工作,但在服务器上不工作(在不同的网络上)。似乎将我的c3p0升级到0.9.2.1版就成功了!谢谢@SteveWaldman的提示。显然它没有起作用,显然死锁又回来了。。。有没有办法在更近或更低级别上监控c3p0的活动,以了解它在尝试获取连接时为什么会挂起?删除Web服务器(tomcat/work/Catalina)的缓存是否与此有关?我发现了一些线程,人们声称这解决了他们的问题。tomcat的热重新部署充满了permgen内存泄漏的地雷,像c3p0这样的库产生了新的线程。c3p0-0.9.5-pre4即将发布,甚至可能在今天,它将有一些新的设置来防止这些泄漏,将新的配置参数privilegeSpawnedThreads设置为true,将contextClassLoaderSource设置为library。也许等一两天试试吧!我完全同意史蒂夫的观点,tomcat的重新部署非常接近“俄罗斯轮盘赌”式的选择。如果你对建议的选项有任何运气,请告诉我们结果,我真的很好奇。