我在ORMLite文档的示例7中配置了ORMLite,但过了一段时间我得到Connection关闭错误
java.sql.SQLException: Connection has already been closed
at com.j256.ormlite.jdbc.JdbcConnectionSource.getReadWriteConnection (JdbcConnectionSource.java:177)
at com.j256.ormlite.jdbc.JdbcConnectionSource.getReadOnlyConnection(JdbcConnectionSource.java:168)
at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:228)
at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:181)
at com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:263)
at com.tube.auction.db.DbFacade.createOrUpdateUser(DbFacade.java:265)
我在代码中只使用dao bean。
<bean id="databaseUrl" class="java.lang.String">
<constructor-arg index="0" value="jdbc:mysql://localhost:3306/auction" />
</bean>
<bean id="connectionSource" class="com.j256.ormlite.jdbc.JdbcConnectionSource" init-method="initialize">
<property name="url" ref="databaseUrl" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<bean id="userDao" class="com.j256.ormlite.spring.DaoFactory" factory-method="createDao">
<constructor-arg index="0" ref="connectionSource" />
<constructor-arg index="1" value="com.tube.auction.dto.User" />
</bean>
如何处理已关闭的连接问题?我看不到任何强制连接重启的方法 例如 请注意,dao.connection returns true
的isOpen()-- 1. Can i test connection here and restart it? How? Code snippet?
try {
userDao.queryForId(someUserId);
} catch(SQLException ex) {
if(is this connection closed?) {
-- 2. What should I do here to restart connection?
}
}
答案 0 :(得分:1)
JdbcConnectionSource
没有内部保持活动机制。 JdbcPooledConnectionSource
产生一个内部线程来执行保持活动测试。这解决了我的问题。
尝试更改bean连接源以使用JdbcPooledConnectionSource
,如下所示:
<bean id="connectionSource" class="com.j256.ormlite.jdbc.JdbcPooledConnectionSource" init-method="initialize">
答案 1 :(得分:0)
我认为这是常见问题解答。一段时间后,服务器可能会关闭数据库连接,因为它暂时没有使用或出于其他原因。
我在这里讨论保持连接打开的方法:
org.hibernate.exception.GenericJDBCException: could not execute query
引用,有很多方法可以解决这个问题:
有关详细信息,请参阅我的回答。