3

何も起こらない場合、MySQL は一定時間 (デフォルトでは 8 時間) 後に接続を閉じます。時間は、構成の wait_timeout 変数の影響を受ける可能性があります。

EclipseLink を永続化フレームワークとして使用する Eclipse RCP アプリケーションがあり、クライアントがタイムアウトを超えるとエラーが発生します。

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
       No operations allowed after connection closed.
   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
   ...
   at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
   at com.mysql.jdbc.Util.getInstance(Util.java:386)
       ...
   com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException
   ...
       org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor...

autoReconnect/autoReconnectForPools=true を設定しようとしましたが、これは役に立ちません。

ありがとう

編集

私のpersistence.xmlには、次のプロパティが設定されています。

    <property 
      name="eclipselink.jdbc.read-connections.max"
      value="10" />
    <property 
      name="eclipselink.jdbc.cache-statements" 
      value="true" />
    <property 
      name="eclipselink.jdbc.read-connections.shared"
      value="true" />

残りの構成はコードで行います。

    Map<Object, Object> map = ...
    map.put(PersistenceUnitProperties.JDBC_URL,...);
    map.put(PersistenceUnitProperties.JDBC_USER,...);
    map.put(PersistenceUnitProperties.JDBC_PASSWORD, ...);
    map.put(PersistenceUnitProperties.JDBC_DRIVER,  ...);
    map.put(PersistenceUnitProperties.CLASSLOADER, this.getClass()
            .getClassLoader());
    map.put(PersistenceUnitProperties.TARGET_DATABASE, "MySQL");
    entityManagerFactory = new PersistenceProvider()
            .createEntityManagerFactory("...", map);
4

2 に答える 2

2

これを行う最も簡単な方法は、1時間程度ごとにある種のキープアライブまたは単純なクエリを送信するスレッドを生成することです。ここでは、プログラムの終了やデータベースの変更などでスレッドをシャットダウンできるようにフラグを残します。そのタイプのシャットダウンに高速に応答する必要がある場合は、forループのカウンターとスリープ時間を変更できます。

boolean parentKilledMe = false;
while (!parentKilledMe){
    //put query here
    for (int x = 0; x < 360 && !parentKilledMe;x++){
        try{
            Thread.sleep(6000);
        } catch (InterruptedException e) {
            //your error handling here
        }
    }
}
于 2011-12-02T13:57:30.243 に答える
2

EclipseLinkは、切断された接続を自動再接続する必要があります。EclipseLinkはエラーをトラップし、接続をテストし、接続が切れている場合は再接続し、場合によってはクエリを再試行します(トランザクション外の場合)。

ただし、これは、使用している接続プール、persistence.xmlによって異なります。

于 2011-12-05T18:16:09.880 に答える