如果没有任何反应,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);
答案 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是什么。