1

ORMLite ドキュメントのサンプル 7 のように ORMLite を構成しましたが、しばらくすると Connection closed エラーが発生します。

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 の isOpen()が true を返すことに注意してください。

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

2 に答える 2

1

JdbcConnectionSource内部キープアライブ メカニズムはありません。 JdbcPooledConnectionSourceキープアライブ テストを実行する内部スレッドを生成します。これで問題は解決しました。

JdbcPooledConnectionSource次のように、使用する Bean 接続ソースを変更してみてください。

<bean id="connectionSource" class="com.j256.ormlite.jdbc.JdbcPooledConnectionSource" init-method="initialize">
于 2016-06-01T19:58:11.217 に答える