2013-07-16 1 views
1

J'ai ORMLite configuré comme dans l'échantillon 7 de ORMLite docs, mais après un moment, je reçois Connexion fermée erreurConnexion fermée avec ORMLite et MySql

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) 

J'utilise seulement dao les haricots dans le code.

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

Comment gérer les problèmes liés à la connexion? Je ne vois aucun moyen de forcer le redémarrage de connexion Par exemple Notez que isOpen() pour dao.connection returns 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? 
    } 
} 
+0

Max Le chat comment vous avez exactement résolu la question? – dorin

Répondre

0

Je pense que c'est une FAQ. Après un certain temps, le serveur peut fermer une connexion à une base de données parce qu'elle n'a pas été utilisée depuis un certain temps ou pour une autre raison.

je parle des façons de garder une connexion ouverte dans cette réponse ici:

org.hibernate.exception.GenericJDBCException: could not execute query

Pour citer, il y a plusieurs façons de contourner ce problème:

  1. Vous pouvez émettre une sorte de requête "keep alive" (ex: SELECT 1) sur la connexion de temps en temps pour la maintenir en vie. Cela suppose qu'il s'est fermé parce qu'il était inactif. Vous pouvez utiliser une "requête brute" ORMLite pour cela.
  2. Vous pouvez rouvrir la connexion de temps en temps. Avec ORMLite, cela dépend du type de source de connexion que vous utilisez.
  3. Si vous obtenez une exception de connexion fermée, vous pouvez simplement rouvrir la connexion. Duh.
  4. Vous pouvez utiliser un pool de connexions qui peut faire le keep-alive et la reconnexion pour vous. Apache's DBCP et HikariCP sont deux de mes favoris de beaucoup. Ils travaillent avec ORMLite.

Voir ma réponse pour plus de détails.

+0

Bonnes idées, cependant, aucune adresse vraiment la question. La question mentionne spécifiquement comment le faire dans ORMLite. – MCToon

+0

ORMlite fonctionne avec DBCP et d'autres bibliothèques de pools de connexions @MCToon. C'est la meilleure réponse. – Gray

0

JdbcConnectionSource ne possède pas de mécanisme de maintien interne. JdbcPooledConnectionSource génère un thread interne pour effectuer des tests dynamiques. Cela a résolu le problème pour moi.

Essayez de changer la source de connexion de haricots à utiliser JdbcPooledConnectionSource, comme ceci:

<bean id="connectionSource" class="com.j256.ormlite.jdbc.JdbcPooledConnectionSource" init-method="initialize"> 
Questions connexes