Hibernate version: 3.2
Name and version of the database you are using: PostGreSQL 8.3
Actuellement, mon application web doit pouvoir tourner avec 100 threads en simultané. Le problème est que l'application s'effondre dès qu'il y a plus de 10 threads. J'ai déjà lu la doc d'hibernate afin de comprendre mes erreurs et ce fut très instructif. Cependant, je ne trouve pas comment régler ce problème. Est-ce une mauvaise gestion du pool avec c3p0, des sessions,des transaction ou de la sessionFactory? Pouriez vous m'iader car je suis totalement perdu.
voici le code source de mon fichier hibernate.cfg.xml :
Code:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory >
<!-- local connection properties -->
<!-- peut etre rajouter hibernate. avant -->
<property name="connection.url">jdbc:postgresql://localhost/Report</property>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.username">mathieu</property>
<property name="connection.password">mathieu</property>
<!-- configuration pool via c3p0-->
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">50</property> <!-- seconds -->
<property name="c3p0.max_size">200</property>
<property name="c3p0.max_statements">0</property>
<property name="c3p0.min_size">20</property>
<property name="c3p0.timeout">10</property> <!-- seconds -->
<!-- EhCache -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_structured_cache">true</property>
<property name="hibernate.cache.use_minimal_puts">true</property>
<!-- reglage des transaction -->
<!--<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>-->
<property name="hibernate.connection.release_mode">auto</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- regalge fetch plan -->
<property name="hibernate.max_fetch_depth">2</property>
<property name="hibernate.default_batch_fetch_size">4</property>
<!-- dialect for PostgreSQL -->
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.show_sql">false</property>
<!-- mapping for Table -->
<mapping resource="com/modele/donnees/Base.hbm.xml"/>
<mapping resource="com/modele/donnees/CodeAffectation.hbm.xml"/>
<mapping resource="com/modele/donnees/CompteRendu.hbm.xml"/>
<mapping resource="com/modele/donnees/Departement.hbm.xml"/>
<mapping resource="com/modele/donnees/Membre.hbm.xml"/>
<mapping resource="com/modele/donnees/Message.hbm.xml"/>
<mapping resource="com/modele/donnees/Poste.hbm.xml"/>
<mapping resource="com/modele/donnees/Recherche.hbm.xml"/>
<mapping resource="com/modele/donnees/Statut.hbm.xml"/>
<mapping resource="com/modele/donnees/LienCompteRendu.hbm.xml"/>
<mapping resource="com/modele/donnees/LienMembreCompteRendu.hbm.xml"/>
</session-factory>
</hibernate-configuration>
voici le code source de ma connexion :Code:
package com.dao.connexion;
import org.hibernate.HibernateException;
import org.hibernate.classic.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class connexion
{
private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
public static Session currentSession() throws HibernateException
{
Session s = (Session) session.get();
// Ouvre une nouvelle Session, si ce Thread n'en a aucune
if (s == null)
{
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession()
throws HibernateException
{
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}
voici un exemple d insert :Code:
try
{
session = connexion.currentSession();
try
{
Departement nouveauDepartement = new Departement();
nouveauDepartement.setNomDepartement(recupererSaisie ("nom"));
nouveauDepartement.setCodeDepartement(recupererSaisie ("code departement"));
Base base = (Base)session.get(Base.class, Integer.parseInt(recupererSaisie("base")));
nouveauDepartement.setBase(base);
base.getDepartements().add(nouveauDepartement);
Transaction transaction = session.beginTransaction();
try
{
session.save(nouveauDepartement);
transaction.commit();
session.evict(nouveauDepartement);
}
catch (RuntimeException e)
{
this.erreur = true;
transaction.rollback();
session.evict(nouveauDepartement);
new RapportErreur(e,classe);
}
}
catch (HibernateException ex)
{
this.erreur = true;
new RapportErreur((Exception)ex, classe);
}
catch (NullPointerException e)
{
this.erreur = true;
new RapportErreur(e,classe);
}
}
catch (Exception ex)
{
new RapportErreur(ex,classe);
this.erreur=true;
}
finally
{
session.clear();
connexion.closeSession();
}
Full stack trace of any exception that occurs: Cannot open connection
PS: J'utilise Jmeter pour tester la monter en charge jusqu'à 80 threads.[/code]