Aucun des opérations après la fermeture de la connexion
J'obtiens cette erreur à partir d'une application Java:
com.mchange.v2.c3p0.impl.NewPooledConnection - [c3p0] Another
error has occurred [
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
No operations allowed after connection closed. ] which will not be
reported to listeners!
Le code Java:
try {
sessionFactory.beginTransaction();
//...
sessionFactory.commitTransaction();
} catch (Exception e) {
sessionFactory.rollbackTransaction();
throw new RuntimeException(e);
}
La fabrique de session:
try {
sessionFactory.beginTransaction();
...
sessionFactory.commitTransaction();
} catch (Exception e) {
sessionFactory.rollbackTransaction();
throw new RuntimeException(e);
}
public Transaction beginTransaction() throws HibernateException {
try {
return sessionFactory.getCurrentSession().beginTransaction();
} catch (HibernateException hex) {
LOG.error(String.format("Unable to start database transaction due to exception: %s.", ExceptionUtils.getRootCauseMessage(hex)));
throw hex;
}
}
public void commitTransaction() throws HibernateException {
LOG.debug("Committing database transaction.");
try {
if (sessionFactory.getCurrentSession().getTransaction().isActive()) {
sessionFactory.getCurrentSession().getTransaction().commit();
} else {
throw new HibernateException("Transaction is no longer Active.");
}
} catch (HibernateException hex) {
LOG.error(String.format("Unable to commit due to exception: %s.", ExceptionUtils.getRootCauseMessage(hex)));
throw hex;
}
}
public void rollbackTransaction() throws HibernateException {
LOG.debug("Trying to rollback database transaction after exception.");
Session session = sessionFactory.getCurrentSession();
try {
if (session.getTransaction().isActive()) {
session.getTransaction().rollback();
} else {
throw new HibernateException("Transaction is no longer Active.");
}
} catch (HibernateException hex) {
LOG.error(String.format("Unable to rollback due to exception: %s.", ExceptionUtils.getRootCauseMessage(hex)));
throw hex;
} finally {
if (session.isOpen()) {
session.close();
}
}
}
Hibernate et C3P0 paramètres:
<prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
<prop key="hibernate.order_inserts">true</prop>
<prop key="hibernate.order_updates">true</prop>
<prop key="hibernate.c3p0.timeout">1800 <!-- seconds --></prop>
<prop key="hibernate.c3p0.min_size">4</prop>
<prop key="hibernate.c3p0.max_size">35</prop>
<prop key="hibernate.c3p0.idle_test_period">240 <!-- seconds --></prop>
<prop key="hibernate.c3p0.acquire_increment">4</prop>
<prop key="hibernate.c3p0.max_statements">0</prop>
<prop key="hibernate.c3p0.preferredTestQuery">SELECT 1</prop>
<prop key="c3p0.testConnectionOnCheckout">true</prop>
<prop key="hibernate.connection.oracle.jdbc.ReadTimeout">60000 <!-- milliseconds --></prop>
Pas sûr de savoir comment la connexion peut être encore en usage et cette erreur renvoyé. Quelle est la cause de cette erreur?
Je ne peux pas dire pour sûr, sans voir tout le code, mais êtes-vous de la fermeture de la session après une livraison réussie? Je ne vois pas que, dans le code ci-dessus. Si non, vous êtes épuisant votre pool de connexion.
La session se ferme automatiquement lorsque la transaction est validée: developer.jboss.org/wiki/....
La session se ferme automatiquement lorsque la transaction est validée: developer.jboss.org/wiki/....
OriginalL'auteur tuxx | 2014-12-17
Vous devez vous connecter pour publier un commentaire.
Cette méthode Java appelé executeQuery:
permettra de lever cette Exception:
si vous essayez de l'exécuter (executeQuery) après l'appel de:
Ce qui se passe
Soit vous essayez d'obtenir une connexion à la base de données et ne sont pas en obtenir un, et essayez d'exécuter une requête contre lui, qui échoue. Ou vous avez une connexion qui a subi un certain problème et a fermé, et vous avez essayé d'exécuter une autre requête à travers elle.
La solution
En supposant que vous avez perdu la connexion de problèmes de réseau ou de quelque chose qui n'est pas de votre faute, puis mettre le code qui tente de la requête dans un bloc try/catch, et sur l'erreur d'attendre 10 secondes et reconnectez-le à la base de données.
OriginalL'auteur Eric Leschinski
votre idleConnectionTestPeriod est de 240,il devrait moins de la db de la valeur de délai d'attente ,voir la config db ,vérifiez la valeur est plus grande que 240.
OriginalL'auteur jerry_li