如何使用EclipseLink避免MySQL连接超时错误?

时间:2011-12-02 12:46:14

标签: java mysql jpa eclipselink connection-timeout

如果没有任何反应,MySQL会在一段时间后关闭连接(8 hours by default)。时间可能受配置中wait_timeout变量的影响。

我有一个Eclipse RCP应用程序,我使用EclipseLink作为持久性框架,当客户端超过超时时出现错误:

    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);

2 个答案:

答案 0 :(得分:2)

最简单的方法是生成一个每小时左右发送一些keepalive或简单查询的线程。在这里,我们将留下一个标志,以便线程可以在程序退出,数据库更改等时关闭。如果它需要更快地响应该类型的关闭,您可以更改for循环中的计数器和休眠时间。 / p>

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
        }
    }
}

答案 1 :(得分:2)

EclipseLink应该自动重新连接死连接。 EclipseLink将捕获错误,测试连接以及是否重新连接并可能重试查询(如果在事务之外)。

但这取决于您使用的连接池,您的persistence.xml是什么。