2013-04-16 30 views
5

Chúng tôi có các lần bế tắc rõ ràng định kỳ trên hệ thống sản xuất của chúng tôi mà chúng tôi dường như không thể đi đến cuối. Chúng tôi không thể theo dõi bất kỳ mối tương quan nào với số lượng người dùng trực tuyến và dường như chúng tôi không có kết nối khả dụng.Rối loạn lặp lại rõ ràng định kỳ với c3p0, Oracle và Hibernate

Chúng tôi có ứng dụng Java EE kết nối với Oracle thông qua Hibernate và c3p0. cấu hình C3P0 của chúng tôi là:

minPoolSize=10 
maxPoolSize=300 
initialPoolSize=30 
acquireIncrement=10 
maxIdleTime=1800 
maxStatementsPerConnection=0 
numHelperThreads=5 

Bế tắc đầu ra log rõ ràng luôn trông nhiều hơn hoặc ít hơn như thế này:

[com.mchange.v2.async.ThreadPoolAsynchronousRunner] (Timer-1) com[email protected]4c9f1b4d -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 5 
    Active Threads: 5 
    Active Tasks: 
      [email protected]86 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
      [email protected]01 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
      [email protected]c4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4) 
      [email protected]8e (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
      [email protected]f8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#3) 
    Pending Tasks: 
      [email protected]e5 
      [email protected]5d 
      [email protected]a1 
      [email protected]eb 
      [email protected]35 

Các thực tế hồ bơi thread đống dấu vết khác nhau, và tôi đã thêm một số ví dụ dưới đây:

Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4,5,jboss] 
      java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:45) 
      java.lang.StringBuilder.<init>(StringBuilder.java:80) 
      oracle.net.ns.Packet.<init>(Packet.java:513) 
      oracle.net.ns.ConnectPacket.<init>(ConnectPacket.java:64) 
      oracle.net.ns.NSProtocol.connect(NSProtocol.java:278) 
      oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042) 
      oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301) 
      oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531) 
      oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221) 
      oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
      oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) 
      com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135) 
      com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182) 
      com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171) 

Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,jboss] 
      oracle.jdbc.driver.T4CTTIoauthenticate.processRPA(T4CTTIoauthenticate.java:491) 
      oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:295) 
      oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) 
      oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:390) 
      oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:356) 
      oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531) 
      oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221) 
      oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
      oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) 
      com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135) 
      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:1 

Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,jboss] 
      oracle.net.ns.NSProtocol.connect(NSProtocol.java:346) 
      oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042) 
      oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301) 
      oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531) 
      oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221) 
      oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
      oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) 
      com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135) 
      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) 

Mọi đề xuất về nơi chúng tôi nên điều tra? Đây có phải là c3p0, các truy vấn của chúng tôi, mã của chúng tôi, cơ sở dữ liệu không?

+1

Bạn có thể loại bỏ cơ sở dữ liệu vì không có mã lỗi ORA-00060. Nếu bạn muốn kiểm tra lại, trong trường hợp ngoại lệ cơ sở dữ liệu bị mất ở đâu đó, các lỗi bế tắc cũng được lưu trong nhật ký cảnh báo. Yêu cầu DBA của bạn kiểm tra (các) nhật ký cảnh báo cho deadlocks, tốt nhất là vào một thời điểm cụ thể. –

+0

@jonearles Cảm ơn, chúng tôi sẽ yêu cầu DBA kiểm tra. Chúng tôi đang hướng tới các vấn đề với các truy vấn của chúng tôi hoặc có lẽ là cấu hình, nhưng với thông tin hạn chế, chúng tôi không chắc chắn cách tiếp tục. – Zecrates

Trả lời

3

vì vậy, chủ đề trợ giúp của bạn rõ ràng đang bị bão hòa bởi việc mua lại Kết nối. điều đó có nghĩa là nhiều nỗ lực để có được các kết nối không thành công hay thất bại với một ngoại lệ trong thời gian dài. đó là vấn đề cuối cùng mà bạn cần phải gỡ lỗi.

điều đầu tiên tôi muốn nâng cấp lên c3p0-0.9.2.1, sử dụng tác vụ có được "phân tán" để tiết kiệm việc sử dụng Chủ đề được gộp khi mua lại không thành công. một gợi ý thứ hai có thể là tăng tham số cấu hình c3p0 gọi là numHelperThreads cho một cái gì đó có lẽ cao hơn nhiều so với mặc định của nó là 3, hoặc thậm chí 5 bạn đang sử dụng. có vẻ như các Chủ đề của bạn đang trong thực tế bị chiếm đóng trong các giai đoạn khác nhau của việc mua lại Kết nối, do đó, tăng số lượng "làn đường" mà qua đó Kết nối có thể được mua lại có thể hữu ích. [nhưng xem postscript bên dưới!]

cuối cùng, câu hỏi sẽ giải thích tại sao kết nối Mua lại hoàn tất quá chậm (đối với một APPADENT DEADLOCK được khai báo, sẽ không có chuyển đổi nào thành công cho thứ gì đó trong 10 giây). đó có thể là cơ sở dữ liệu hoặc vấn đề về mạng.

nhưng hãy thử nâng cấp lên 0.9.2 và tăng numHelperThreads. [giá trị mặc định của numHelperThreads có lẽ đã lỗi thời; trong thời đại của các máy đa lõi, một nhóm Thread dành cho các nhiệm vụ ràng buộc IO có thể là bội số của số lõi] các chỉnh sửa này có thể giải quyết tốt vấn đề hoặc dẫn đến thông tin tốt hơn về vị trí tiếp theo.

chúc may mắn!

p.s. Tôi đoán rằng các dấu vết ngăn xếp Thread bạn hiển thị không thực sự ngăn xếp dấu vết từ trong quá trình xây dựng lên một DEADLOCK APPARENT. nó sẽ là khó khăn để thời gian những người, vì bạn không biết một DEADLOCK APPARENT sắp xảy ra cho đến khi c3p0 công bố nó. Tôi muốn đặt cược rằng, trong bế tắc, các dấu vết ngăn xếp này là nhiều hơn nữa tương tự như nhau, và đang chờ đợi trên một số loại IO.

+0

Cảm ơn Steve, chúng tôi sẽ nâng cấp c3p0 vào cuối tuần để xem liệu nó có giúp ích không. Tôi sẽ cung cấp phản hồi vào tuần tới. – Zecrates

+0

Xin chào, tôi có thể biết liệu sự cố của bạn có được giải quyết bằng cách nâng cấp không? hoặc điều chỉnh poolize & helperthread? – ROROROOROROR

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