49

MySQL 5.1.30 と一緒に Hibernate を使用しています。

次のライブラリがあります。

  • c3p0-0.0.1.2.jar
  • mysql-connector-java-5.0.3-bin.jar
  • hibernate3.jar

構成に hibernate.cfg.xml を使用します。

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property> 

        <property name="connection.url">jdbc:mysql://localhost/fooDatatbase</property>
    <property name="connection.username">foo</property>
    <property name="connection.password">foo123</property>

        <!-- Use the C3P0 connection pool provider -->
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.idle_test_periods">3000</property>       

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping resource="databaselayer/mail/Mail.hbm.xml"/>
        <mapping resource="databaselayer/courses/Course.hbm.xml"/>
        <mapping resource="databaselayer/price/Price.hbm.xml"/>        
        <mapping resource="databaselayer/contact/Contact.hbm.xml"/>
        <mapping resource="databaselayer/artists/Musician.hbm.xml"/>
        <mapping resource="databaselayer/concerts/Concert.hbm.xml"/>     
        <mapping resource="databaselayer/welcome/Welcome.hbm.xml"/>
        <mapping resource="databaselayer/information/Information.hbm.xml"/>                             
    </session-factory>
</hibernate-configuration>

JAVA persistance with hibernate bookでは、c3p0 構成オプションが説明されています。

  • hibernate.c3p0.min_sizeこれは、C3P0 が常に準備しておく JDBC 接続の最小数です。
  • hibernate.c3p0.max_sizeこれは、プール内の接続の最大数です。この数が使い果たされると、実行時に例外がスローされます。
  • hibernate.c3p0.timeoutアイドル接続がプールから削除されるまでのタイムアウト期間 (この場合は 300 秒) を指定します。
  • hibernate.c3p0.max_statementsキャッシュされるステートメントの最大数。Hibernate で最高のパフォーマンスを得るには、準備済みステートメントのキャッシュが不可欠です。
  • hibernate.c3p0.idle_test_periodsこれは、接続が自動的に検証されるまでの秒単位のアイドル時間です。

Java 1.5.0_09 とtomcat 6.0を使用しています。Tomcat に 3 つのアプリケーションをデプロイしています。それらはそれぞれ、上記とほぼ同等の構成ファイルで hibernate を使用します (ユーザー名、データベース名、パスワード、およびマッピングリソースのみが変更されます)。

残念ながら、上記の設定では、数時間実行した後、 Tomcat を強制終了するいくつかの厄介なデッドロック エラーが発生します。

Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@2437d -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1dc5cb7 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@9cd2ef -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4af355 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1275fcb -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:35 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run

これは、何人かの人々がすでに得たエラーのようです。http://forum.hibernate.org/viewtopic.php?p=2386237で説明されている回避策に従って、設定を次のように変更しました。

<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.min_size">0</property>
<property name="hibernate.c3p0.max_size">48</property>
<property name="hibernate.c3p0.timeout">0</property>
<property name="hibernate.c3p0.max_statements">0</property>

新しい設定では、デッドロックは発生しませんが、次のようになります。

WARNING: SQL Error: 0, SQLState: 08S01
Jan 24, 2009 5:53:37 AM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException

STACKTRACE:

java.io.EOFException
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)

私が間違っていることと、c3p0を正しくセットアップする方法を知っている人はいますか?

4

6 に答える 6

54

実際には、これはおそらく遅すぎますが、問題は非常に単純です: hibernate.c3p0.idle_test_periodsデータベースhibernate.c3p0.timeoutによって閉じられた接続が正しく検出されません。

さらに、デッドロック検出の警告は、コードの一部がプールへの接続を適切に返していないように見えます (つまり、session.close())。

アプリケーションがアイドル状態になり、MySQL がサーバー上の接続を閉じると、MysqlIO 例外が発生します。接続がまだ実際に接続されているかどうかを C3P0 が適切にチェックしない場合、EOFExceptions が発生します。

これが役立つことを願っています。

于 2010-09-17T00:52:26.110 に答える
10

この質問に対する決定的な答えはありません。用途と負荷パターンに応じてアプリケーションごとに変化するためです。

最初のポイントは、リンクhttps://www.hibernate.org/214.htmlを参照することです。それは、あなたがそれを行って先に進んだようだからです。ここにいくつかのヒントがあります。

  • numHelperThreads : 競合ロックを保持しないヘルパー スレッド。これらの操作を複数のスレッドに分散する
  • maxStatements : c3p0 のグローバル PreparedStatement キャッシュのサイズ。
  • maxStatementsPerConnection : 1 つのプールされた接続に対して c3p0 がキャッシュする PreparedStatements の数。
  • maxAdministrativeTaskTime : タスクが設定された時間制限を超えた場合に、タスク スレッドの interrupt() メソッドの呼び出しを強制するパラメーター

最初の 3 つのパラメーターは、設定された値に基づいてパフォーマンスを向上または低下させることができます。4 番目のパラメーターは、設定された制限の後にスレッドを中断し、他のスレッドに実行するように変更を与えることができます。

おおよその値

  • numHelperThreads = 6
  • 最大ステートメント = 100
  • maxStatementsPerConnection = 12
  • maxAdministrativeTaskTime = 大量のクエリを本番環境で実行できるように十分な時間が必要

maxStatements と maxStatementsPerConnection は、これらのパラメーターが原因でデッドロックになる投稿ポイントがほとんどないため、数か月間テストする必要があります。

これらのリンクも参照すると便利です。

于 2009-08-13T15:14:29.563 に答える
3

hibernate.c3p0.idle_test_periodsは h* ibernate.c3p0.timeout *よりも小さくする必要があります。最初の値は、休止状態の接続をチェックしてそれを閉じようとする時間値にすぎないためです。

一方、2 番目は、接続を破棄する必要がある時間です。

idle_test_periods が hibernate よりも timeout パラメーターよりも大きい場合は、null であるか、システムに存在しないものを探します。少なくとも私はこのように理解しました。

于 2014-01-10T10:29:05.747 に答える
1

これは、Connector/Jのかなり古いバージョンです。既知の修正されたバグと戦っていないことを確認するために、最新のバグ(5.0.8)を入手することから始めます。

http://dev.mysql.com/downloads/connector/j/5.0.html

それEOFExceptionMysqlIO少し疑わしいです。通常の/バギーでない使用法では、そのレイヤーからエラーが発生することはありません。

于 2009-08-18T00:03:41.793 に答える
0

3つのアプリケーションは同じ接続プールを共有しますか、それともそれぞれが独自の接続プールを取得しますか?後者をお勧めします。

于 2009-01-24T13:33:07.073 に答える