2013-08-07 34 views
9

tôi tiếp tục nhận được ngoại lệ này trong nhật ký Tomcat của tôi:C3P0 bế tắc rõ ràng ngoại lệ

com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 
WARNING: com[email protected]76b28200 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 
WARNING: com[email protected]76b28200 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3 
    Active Threads: 3 
    Active Tasks: 
     [email protected]18 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
     [email protected]e4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
     [email protected]d8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
    Pending Tasks: 
     [email protected]53 
     [email protected]24 
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) 

Tôi đang sử dụng Hibernate 3.6.2 và C3P0 0.9.1.2 với MySQL. Sau một vài giờ tìm kiếm Google, ngoại lệ APPARENT DEADLOCK này dường như thường được kết hợp với bộ nhớ đệm báo cáo đã chuẩn bị. Đây là cấu hình C3P0 của tôi trong hibernate.cfg.xml của tôi:

<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> 

Tôi không thực hiện bất kỳ lưu ý bộ nhớ đệm nào. Bất kỳ gợi ý về những gì là sai ở đây sẽ được đánh giá rất nhiều.

Trả lời

9

Các tác vụ được xử lý là các nhiệm vụ Thu nhận kết nối. Tức là, c3p0 đang cố gắng để có được các Kết nối mới từ cơ sở dữ liệu của bạn và những nỗ lực chuyển đổi Kết nối này mất nhiều thời gian.

Điều đầu tiên tôi sẽ làm là nâng cấp lên 0.9.2.1, trong đó có nhiều phương tiện được cải thiện để thực hiện vòng Mua lại kết nối trong các tình huống mà đôi khi các lần mua lại không thành công.

Nếu điều đó không giải quyết được vấn đề của bạn, thì bạn cần tìm ra lý do tại sao các nỗ lực của C3p0 để có được kết nối bị treo trong một thời gian dài: không thành công hay thất bại với ngoại lệ.

+0

Dường như nâng cấp c3p0 lên phiên bản 0.9.2.1 của tôi đã thực hiện thủ thuật! Cảm ơn @SteveWaldman về mẹo. – corderazo00

+0

Dường như nó đã không làm các trick, APPARENT DEADLOCK là trở lại ... Có cách nào để giám sát các hoạt động của c3p0 gần hơn hoặc ở mức thấp hơn để xem tại sao chính xác nó treo khi cố gắng để có được một kết nối? – corderazo00

+0

Xóa bộ nhớ cache của máy chủ web (tomcat/work/Catalina) có liên quan gì không? Tôi đã tìm thấy một số chủ đề mà mọi người cho rằng điều này đã giải quyết được vấn đề của họ. – corderazo00

1

Trong trường hợp cụ thể của tôi, sự cố phải liên quan đến cấu hình máy chủ mà tôi đã triển khai ứng dụng của mình.

Đó là chỉ sau khi in ra stack dấu vết của ứng dụng của tôi rằng đó là treo vì trình điều khiển oracle đã chờ đợi một số ngẫu nhiên an toàn được tạo ra:

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) 

Sau đó, tôi đã phải học và hiểu một chút về tiếng ồn entropy và có thể nhận ra, với một chút giúp đỡ từ những người bạn Unix của tôi, rằng một trong những máy chủ đã không cài đặt một gói tạo ra "tiếng ồn".

Như đã đề cập trong bài viết sau đây tôi chạy các lệnh tiếp theo: cat /proc/sys/kernel/random/entropy_avail 23 cat /proc/sys/kernel/random/poolsize 4096

Vì vậy, có nơi quá ít entropy có sẵn để tạo ra một số ngẫu nhiên an toàn.

Sau khi cài đặt gói cat /proc/sys/kernel/random/entropy_avail 4096 Sau đó, tôi không có khóa chết rõ ràng hơn, ứng dụng của tôi có thể nhận kết nối với DB.

http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

0

Có lỗi tương tự như trước đây.

Nó cũng có thể do máy chủ cơ sở dữ liệu chặn IP của bạn. Đảm bảo IP của máy chủ của bạn không bị máy chủ cơ sở dữ liệu/nhà cung cấp dịch vụ đám mây chặn.

Trong trường hợp của tôi, đã cố gắng chèn dữ liệu vào cơ sở dữ liệu trong đám mây với đa luồng, và nó chỉ hoạt động trên máy cục bộ, nhưng không hoạt động trên máy chủ (trên một mạng khác).

Các vấn đề liên quan