6

hirbernate を使用して高負荷の Java アプリケーションを使用しています。また、以前は接続プールDBCPとして使用していましたが、接続が失われるという問題がありました。私はc3p0に切り替えました。しかし、今ではスレッドがブロックされることがありますが、その理由はわかりません。ここみたいに:

"1343694829@qtp-515693101-1941" prio=10 tid=0x00007fa6b0940000 nid=0x4e12 runnable [0x00007fa6f8f1c000]
   java.lang.Thread.State: RUNNABLE
    at com.mchange.v2.resourcepool.BasicResourcePool.doCheckinManaged(BasicResourcePool.java:1258)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkinResource(BasicResourcePool.java:647)
    - locked <0x00007fa7286d9728> (a com.mchange.v2.resourcepool.BasicResourcePool)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$ConnectionEventListenerImpl.doCheckinResource(C3P0PooledConnectionPool.java:636)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$ConnectionEventListenerImpl.connectionClosed(C3P0PooledConnectionPool.java:630)
    at com.mchange.v2.c3p0.util.ConnectionEventSupport.fireConnectionClosed(ConnectionEventSupport.java:55)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.fireConnectionClosed(NewPooledConnection.java:510)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:381)
    at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:1246)
    - locked <0x00007fa794ccf020> (a com.mchange.v2.c3p0.impl.NewProxyConnection)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.closeConnection(LocalDataSourceConnectionProvider.java:96)
    at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:474)
    at org.hibernate.jdbc.ConnectionManager.cleanup(ConnectionManager.java:408)
    at org.hibernate.jdbc.ConnectionManager.close(ConnectionManager.java:347)
    at org.hibernate.impl.SessionImpl.close(SessionImpl.java:325)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSession(SessionFactoryUtils.java:791)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSessionOrRegisterDeferredClose(SessionFactoryUtils.java:777)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.releaseSession(SessionFactoryUtils.java:755)

' スタック トレース ダンプは、このスレッドが他のすべてのスレッドをロック <0x00007fa7286d9728> でブロックしていることを示していたため、しばらくするとサーバーが完全にブロックされました。1 つのスレッドが他のすべてのスレッドを長時間ブロックしていた場合、またはこのスレッドで消費された時間が非常に長かった場合、このスレッドの実行時間はわかりませんが、結果として、システムが完全にブロックされ、非常に遅くなりました。私はたくさんグーグルで検索しましたが、この問題を解決する方法がわかりません。接続を閉じてできるだけ早くトレッドを終了するには、プールが必要です。他の接続プールを使用する必要がありますか? 私にとっては、このプール ライブラリが 100% 保存され、デッドロック、ライフロック、飢餓がなく、他のライブラリよりも少し遅いことが絶対に必要です。

助けてくれてありがとう

4

2 に答える 2

3

BoneCP(http://jolbox.com )をご覧になることをお勧めします。

C3P0 / DBCPよりもはるかに優れたパフォーマンスであり、これまでのところデッドロックの報告はありません。

于 2011-01-14T15:33:47.697 に答える
1

1)DBCPで接続が失われるとはどういう意味ですか? MySQL を使用していますか? しばらくアクティビティがなかった場合、MySQL での作業で接続が失われるという問題を知っています。それはあなたの場合ですか?

2) 負荷の高いアプリで Hibernate を使用するのはあまり良い選択ではありません。Hibernate は、特に複雑なデータとリレーションでは大きすぎて遅いです (たとえば、データを取得したいだけでも、すべてのセッションでトランザクションが必要です)。

3) 必要なスレッドが多すぎて、プール内のスレッドが不足している可能性がありますか?

高負荷プロジェクトに参加しました。ソフトデータにはHibernateを使用し(多くのリクエストは、あまり複雑なマッピングを持たない複数のレコードで構成されていました)、重いデータにはJDBCを介した自己作成ラッパーを使用します(ハードマニュアルマッピングを使用したSPを介した数千レコードのリクエストはあまりありません)。DBCP では、非アクティブな状態が長く続いた後に MySQL データベースへの接続が失われたことを除いて、何の問題もありませんでした。

于 2010-11-22T15:03:21.293 に答える