6

実行中にハングするコンソールアプリケーションがあります。これが私の設定です:

    cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
    cfg.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/db?user=db&password=db");
    cfg.setProperty("hibernate.connection.username", "db");
    cfg.setProperty("hibernate.connection.password", "db");
    cfg.setProperty("hibernate.connection.pool_size", "5");
    cfg.setProperty("hibernate.connection.autocommit", "false");
    cfg.setProperty("hibernate.c3p0.min_size", "5");
    cfg.setProperty("hibernate.c3p0.max_size", "20");
    cfg.setProperty("hibernate.c3p0.timeout", "300");
    cfg.setProperty("hibernate.c3p0.max_statements", "50");
    cfg.setProperty("hibernate.c3p0.idle_test_period", "3000");

これが私のスタックトレースです:

"main" prio=10 tid=0x000000000168f800 nid=0x1c37 in Object.wait() [0x00007fa60d0ad000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007400f4c68> (a com.mchange.v2.resourcepool.BasicResourcePool)
        at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1315)
        at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
        - locked <0x00000007400f4c68> (a com.mchange.v2.resourcepool.BasicResourcePool)
        at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
        at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
        at org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:84)
        at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:281)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169)
        at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
        at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
        at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1392)
        at org.kriyak.parser.IndexArchiveRapid.indexFile(IndexArchiveRapid.java:70)
        at org.kriyak.parser.IndexArchiveRapid.main(IndexArchiveRapid.java:53)

私は1つのconenctonだけを開きます、そして私がそれらを漏らしているようには見えません。また、私は1つのスレッドを使用します。メモリ使用量を除いて、mysql設定を調整していません。Mysqlはコンソールから正常に動作します。なぜこれが起こるのでしょうか?これはc3p0エラーですか?

4

3 に答える 3

14

これはすぐに起こりますか、それともしばらくしてからですか。つまり、チェックアウトは最初は成功しますが、その後このようにハングしますか? もしそうなら、それは接続リークのように見えます。c3p0 params unreturnedConnectionTimeout と debugUnreturnedConnectionStackTraces を設定して、リークがあるかどうかを確認してください。http://www.mchange.com/projects/c3p0/#configuring_to_debug_and_workaround_broken_clientshttp://www.mchange.com/projects/c3p0/#unreturnedConnectionTimeouthttp://www.mchange.com/projects/c3p0/#を参照 してください。 debugUnreturnedConnectionStackTraces

これがすぐに発生した場合、正常にチェックアウトされた接続がない場合、問題は、プールが接続の取得に成功したかどうかです。デフォルトでは、成功しない場合、約 30 秒後にスレッドが失敗して中断します。(これを行ったようには見えませんが、たとえば acquireRetryAttempts を 0 に設定すると、c3p0 が接続を待って無期限にハングする可能性があります。)

c3p0 の問題をデバッグするには、c3p0 がプールの初期化時に INFO レベルでログに記録するバージョンと構成情報を取得すると役立ちます。

幸運を!

于 2013-01-01T07:30:33.160 に答える
3

また、クライアントが接続プールから接続を取得するまで待機する時間を指定する c3p0 の checkoutTime パラメータを初期化していないようです。

http://www.mchange.com/projects/c3p0/#checkoutTimeoutを参照してください

于 2013-08-26T05:57:12.623 に答える