与ORMLite和MySql的封闭连接

时间:2013-07-16 05:17:57

标签: mysql spring ormlite

我在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?
   }
}

2 个答案:

答案 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

引用,有很多方法可以解决这个问题:

  1. 您可以经常在连接上发出某种“保持活跃”类型的查询(例如:SELECT 1)以使其保持活动状态。这假设它因为空闲而关闭。您可以使用ORMLite“原始查询”。
  2. 您可以经常重新打开连接。使用ORMLite,这取决于您使用的连接源类型。
  3. 如果您收到连接已关闭的异常,则可以重新打开连接。咄。
  4. 您可以使用连接池,它可以为您保持活动和重新连接。 Apache's DBCPHikariCP是我最喜欢的两个。他们使用ORMLite。
  5. 有关详细信息,请参阅我的回答。