MySQL 5.1.30と一緒にHibernateを使用します。
次のライブラリがあります:
設定には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>
hibernateのJava永続性の本では、c3p0構成オプションについて説明しています。
Java 1.5.0_09およびTomcat 6.0を使用します。Tomcatに3つのアプリケーションがデプロイされています。それぞれがほぼ同等の構成ファイルでhibernateを使用しています。上記(ユーザー名、データベース名、パスワード、マッピングリソースのみが変更されます)。
残念ながら、上記の設定では、数時間実行すると、Tomcatの強制終了を引き起こす厄介なDeadlockエラーが発生します。
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を正しくセットアップする方法を知っていますか?
実際、これはおそらく遅すぎますが、問題は非常に単純です:_hibernate.c3p0.idle_test_periods
_は_hibernate.c3p0.timeout
_より高くてはなりません。さもないと、データベースによって閉じられた接続が正しく検出されません。
さらに、デッドロック検出の警告は、コードの一部が接続をプールに正しく返していないように見えます(つまり、session.close())
アプリケーションがアイドル状態になり、MySQLがサーバー上の接続を閉じると、MysqlIO例外が発生します。 C3P0が接続が実際にまだ接続されているかどうかを適切にチェックしない場合、EOFExceptionsを受け取ります。
これが役立つことを願っています。
この質問に対する明確な答えはありません。使用法と負荷パターンに応じてアプリケーションごとに変わるためです。
最初のポイントは、リンクを参照することです https://www.hibernate.org/214.html 。ここにいくつかのヒントがあります。
最初の3つのパラメーターは、設定された値に基づいてパフォーマンスを向上または低下させることができます。ここで、上記のパラメーターは、制限の設定後にスレッドを中断し、他のスレッドに実行する変更を与えることができます。
おおよその値
maxStatementsおよびmaxStatementsPerConnectionは、これらのパラメーターが原因でデッドロックへのポストポイントが少ないため、数か月間テストする必要があります。
これらのリンクを参照することも役立ちます。
hibernate.c3p0.idle_test_periodsは、h *ibernate.c3p0.timeout*よりも小さくなければなりません休止状態がアイドル状態の接続をチェックし、それを閉じようとする時間値。
一方、2番目は、接続をイジェクトする必要がある時間だけです。
Idle_test_periodsがtimeoutパラメーターよりも大きい場合、休止状態はnullまたはシステムに存在しないものを探します。少なくともこのように理解しました。
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.idle_test_periods">3000</property>
idle_test_periodの値は、タイムアウト値と同じである必要があります。
これは、Connector/Jのかなり古いバージョンです。既知の修正されたバグと戦っていないことを確認するために、最新のバグ(5.0.8)を取得することから始めます。
http://dev.mysql.com/downloads/connector/j/5.0.html
EOFException
からのMysqlIO
は少し疑わしいです。通常の使用/バグのない使用では、そのレイヤーからエラーが発生することはありません。
3つのアプリケーションは同じ接続プールを共有しますか、それともそれぞれが独自のプールを取得しますか?後者をお勧めします。