erreur accès à la base (après un jour) [Hibernate] - Java - Programmation
Marsh Posté le 13-05-2009 à 13:41:35
Finalement, j'ai trouvé d'où venait le problème. Au bout d'un jour d'inactivité, la connection à la base était coupée et on ne pouvait plus faire de requête. J'ai utilisé dans le fichier de config hibernate le pool de connection c3po et depuis ça marche. Si quelqu'un a le même problème que moi, j'ai télécharger la lib c3po et mis ces lignes dans ma config :
<property name="c3p0.min_size">10</property>
<property name="c3p0.max_size">100</property>
<property name="c3p0.timeout">3600</property>
<property name="c3p0.max_statements">0</property>
<property name="c3p0.acquireRetryAttempts">30</property>
<property name="c3p0.acquireIncrement">5</property>
<property name="c3p0.idleConnectionTestPeriod">1800</property>
<property name="c3p0.initialPoolSize">20</property>
<property name="c3p0.maxPoolSize">100</property>
<property name="c3p0.maxIdleTime">300</property>
<property name="c3p0.minPoolSize">10</property>
depuis, plus de problème ! Merci quand même !
Marsh Posté le 06-05-2009 à 08:49:30
(pardon de redire ce que j'ai dit sur un autre forum, mais là j'ai vraiment besoin d'aide)
Bonjour,
Je me permets de poster sur ce forum (pour la première fois), parce que là je suis complètement perdue, et après des heures à chercher sur google et les docs hibernate, je ne sais plus quoi faire.
En fait voilà, j'utilise hibernate pour une appli de production. Quand je bosse en local sur mon poste, pas de problème. Quand je le met en ligne, au départ pas de problème, et puis au bout d'un moment l'appli plante au moment où je fais une requête sur la base. Ca remarche si je relance mon serveur tomcat. Et l'erreur revient au bout d'un certain temps. Du coup c'est l'horreur pour faire des tests parce que ça ne plante pas à chaque fois. Je me suis demandée si je n'utilisais pas mal la session, ou si j'avais mal configuré hibernate. Voilà mon code :
(ajout : J'ai réussi à trouver ce matin la ligne qui lançait une exception :
java.util.List maList = q.list();
Mais je vois pas pourquoi ça me plante seulement plusieurs heures après la mise en ligne. C'est possible qu'une partie des données reste en cache ?
Si quelqu'un a une petite idée, merci de m'aider, je me sens perdue )
Ma requete :
static public java.util.List loadListeFromHQL(String queryHql) throws ModeleException {
try {
if (queryHql == null) {
maLog.warn("loadListeFromHQL() - Erreur - Appel de la méthode avec un param. queryHql à null" );
throw new ModeleException("loadListeFromHQL() - Erreur - Appel de la méthode avec un param. queryHql à null" );
}
// Rècupère la session attachée au thread courant ou la crée si nécessaire
Session hibSes = hibSesFac.getCurrentSession();
// démarre la transaction et charge l'objet.
Transaction tx = hibSes.beginTransaction();
Query q = hibSes.createQuery(queryHql);
java.util.List maList = q.list();
// On ferme la session hibernate et on relache la connexion à la base
tx.commit();
return maList;
} catch (Exception ex) {
maLog.warn("loadListeFromHQL() - Erreur load Hibernate pour la requete " +
queryHql + " - " + ex.getMessage());
throw new ModeleException(ex.getMessage());
}
}
Avec hibSes une classe à part, instanciée une fois, et dedans la fonction :
public Session getCurrentSession(){
if (sessionFactory == null) init();
return sessionFactory.getCurrentSession();
}
Ma config hibernate
<hibernate-configuration>
<session-factory>
<!-- local connection properties -->
<property name="hibernate.connection.url">
****
</property>
<property name="hibernate.connection.driver_class">
com.ibm.db2.jcc.DB2Driver
</property>
<property name="hibernate.connection.username">***</property>
<property name="hibernate.connection.password">***</property>
<!-- dialect for DB2 -->
<property name="dialect">
org.hibernate.dialect.DB2Dialect
</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
// mes mappings
</session-factory>
</hibernate-configuration>
Et l'erreur quand j'appelle la fonction :
05-05-2009|08:44:57 [WARN] (AbstractBatcher.java:closeQueryStatement:280) - exception clearing maxRows/queryTimeout
com.ibm.db2.jcc.a.SqlException: Invalid operation: statement closed
at com.ibm.db2.jcc.a.hd.B(hd.java:2523)
at com.ibm.db2.jcc.a.hd.getMaxRows(hd.java:666)
at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:276)
at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:212)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1801)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2220)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
... erreur dans mes classes
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:773)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:895)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)
05-05-2009|08:44:57 [WARN] (JDBCExceptionReporter.java:logExceptions:77) - SQL Error: -4499, SQLState: null
05-05-2009|08:44:57 [ERROR] (JDBCExceptionReporter.java:logExceptions:78) - A communication error has been detected. Communication protocol being used: Reply.fill(). Communication API being used: InputStream.read(). Location where the error was detected: insufficient data. Communication function detecting the error: *. Protocol specific error codes(s) TCP/IP SOCKETS DB2ConnectionCorrelator: C0A847C1.A10C.090504144204
05-05-2009|08:44:57 [WARN] (Log.java:log:67) - loadListeFromHQL() - Erreur load Hibernate pour la requete from appli.metier.ind.SaisieInd - could not execute query
05-05-2009|08:44:57 [WARN] (PropertyMessageResources.java:loadLocale:352) - Resource org/apache/struts/action/ActionResources_fr_FR.properties Not Found.
05-05-2009|08:44:57 [WARN] (PropertyMessageResources.java:loadLocale:352) - Resource org/apache/struts/action/ActionResources_fr.properties Not Found.
05-05-2009|08:44:57 [WARN] (RequestProcessor.java:processException:512) - Unhandled Exception thrown: class appli.exception.ModeleException
05-05-2009|08:44:57 [ERROR] (StandardWrapperValve.java:invoke:253) - "Servlet.service()" pour la servlet action a généré une exception
appli.exception.ModeleException: could not execute query
at appli.metier.Modele.loadListeFromHQL(Modele.java:259)
... dans mes classes
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:773)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:895)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)
Merci pour votre aide, je suis désespérée.
Message édité par cespa le 13-05-2009 à 13:42:04