2011-01-29 41 views
2

MySQLとMySQL Connector/J(MySQLの公式JDBCドライバ)を使用するJava EEアプリケーションでHibernate(3.6.0.-Final)に問題があります。私hibernate.cfg.xmlHibernate JDBCExceptionReporter - >接続の有効性、タイムアウト、自動再接続

、私はこれらのコード行があります。

<hibernate-configuration> 
    <session-factory> 
     <!-- Database connection settings --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://localhost/mydbtest</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password">mypassword</property> 
     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">20</property> 
     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
     <!-- Enable Hibernate's automatic session context management, in this case 
      the session will be close after each transaction! --> 
     <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> 
     <!-- auto create tables --> 
     <property name="hbm2ddl.auto">none</property> 
     ... 
    </session-factory> 
</hibernate-configuration> 

を私は誰かが私に言っていたので、私はこれをしなかった(と私はこれらの問題を抱えていた)20に1からプロパティconnection.pool_sizeの値を変更データがロードされず、接続プール・サイズでエラーがスローされたことを確認します。また、

は、だから私は20に値を変更したが、今、私はこのエラーを取得する:

Hibernate: select ... 
WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 08S01 
ERROR: org.hibernate.util.JDBCExceptionReporter - 
     The last packet successfully received from the server was 61.428.729 
     milliseconds ago. The last packet sent successfully to the server was 
     61.428. milliseconds ago. is longer than the server configured value of 
     'wait_timeout'. You should consider either expiring and/or testing 
     connection validity before use in your application, increasing the server 
     configured values for client timeouts, or using the Connector/J 
     connection property 'autoReconnect=true' to avoid this problem. 

は、だから私は、これらの可能な解決策で何をすべきでしょうか?これらのJDBC接続の問題を解決する最良の方法は何ですか? c3p0についてはsthを読んでいますが、接続プールが新しくなりました。私は問題を理解していません:私は20の接続プールを持っています。なぜそれが失敗するのですか?なぜ例外をスローし、新しいものをオープンしないのですか?

ありがとうございます。&よろしくお願いします。

- 更新 -

<property name=“hibernate.c3p0.acquire_increment”>3</property> 
<property name=“hibernate.c3p0.idle_test_period”>14400</property> 
<property name=“hibernate.c3p0.timeout”>25200</property> 
<property name=“hibernate.c3p0.max_size”>15</property> 
<property name=“hibernate.c3p0.min_size”>3</property> 
<property name=“hibernate.c3p0.max_statements”>0</property> 
<property name=“hibernate.c3p0.preferredTestQuery”>select 1;</property> 

- アップデート2 -

/etc/my.cnfファイル:

[mysqld] 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
user=mysql 
# Disabling symbolic-links is recommended to prevent assorted security risks 
symbolic-links=0 

[mysqld_safe] 
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 
+0

問題は解決しましたか?変更されたことが機能しましたか? –

答えて

2

これは通常、非アクティブのいくつかの時間後に発生し、 MySQLはサーバー側で接続を閉じました。しかし、クライアント側(あなたのアプリケーション)での接続はまだ利用可能なので、それは古くなってしまいます。

接続プーリング機構を使用することで、必要に応じて接続の開閉を行い、このような問題を回避します。エラーメッセージが示すように、URLにJDBCオプションautoReconnect = trueを使用する方法もあります。もう1つは、アプリケーションに配信する前に接続を開いてテストするように接続プーリング・メカニズムを構成することです。

+0

私の質問が更新されました。これらの 'c3p0'の行が見つかりました。これも機能しますか? – Tim

+0

C3P0タイムアウトがMySQLサーバで設定されたタイムアウトよりも低い場合に役立ちます。 – jpkrohling

+0

デフォルトのタイムアウトはどのように表示されますか? my.cnfの内容で質問を更新しました。 – Tim