Pour configurer un pool de connexions avec c3p0, il faut inclure la bibliothèque correspondante. Celle-ci se trouve dans le répertoire lib/optional/c3p0 de l'archive de distribution d'Hibernate.
La configuration s'effectue principalement via le fichier hibernate.cfg.xml. Voici un exemple intégrant les paramètres de c3p0 :
<hibernate-configuration>
<session-factory>
<!-- Paramètres de connexion à la base de données -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- Affichage des requêtes SQL -->
<property name="show_sql">true</property>
<!-- Mise à jour automatique du schéma -->
<property name="hbm2ddl.auto">update</property>
<!-- Paramètres du pool de connexions c3p0 -->
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">50</property>
<property name="c3p0.timeout">3000</property>
<property name="c3p0.max_statements">50</property>
<!-- Dialecte Hibernate -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<mapping resource="com/modele/Eleve.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Un test unitaire simple pour vérifier la connexion et exécuter une requête pourrait ressembler à ceci :
package com.exemple.service;
import com.exemple.model.Eleve;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.NativeQuery;
import java.util.List;
public class TestConnexion {
private final SessionFactory usineDeSessions = HibernateUtil.getUsineDeSessions();
public void recupererDonneesEleves() {
try (Session session = usineDeSessions.openSession()) {
String requeteSql = "SELECT * FROM t_eleve";
NativeQuery<Eleve> requete = session.createNativeQuery(requeteSql, Eleve.class);
List<Eleve> listeEleves = requete.getResultList();
for (Eleve eleve : listeEleves) {
System.out.println(eleve);
}
}
}
}
À l'exécution, si la configuration est correcte, des informations sur le pool c3p0 devraient apparaître dans la console. L'absence du fichier JAR c3p0-*.jar entraînera une erreur de classe non trouvée.
Intégration du framework de journalisation Log4J
Hibernate utilise par défaut un logger simple. Pour basculer vers Log4J, il faut ajouter la dépendance log4j au projet et éventuellement le pont slf4j-log4j12 pour connecter les deux.
Créez un fichier log4j.properties dans le répertoire src avec la configuration suivante :
# Configuration racine
log4j.rootLogger=TRACE, sortieConsole, sortieFichier
# Appender pour la console
log4j.appender.sortieConsole=org.apache.log4j.ConsoleAppender
log4j.appender.sortieConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.sortieConsole.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n
# Appender pour un fichier
log4j.appender.sortieFichier=org.apache.log4j.FileAppender
log4j.appender.sortieFichier.File=logs/application.log
log4j.appender.sortieFichier.layout=org.apache.log4j.PatternLayout
log4j.appender.sortieFichier.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Ensuite, injectez et utilisez le logger dans votre code :
package com.exemple.service;
import org.apache.log4j.Logger;
import com.exemple.model.Eleve;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import java.util.List;
public class ServiceEleve {
private static final Logger journal = Logger.getLogger(ServiceEleve.class);
private final SessionFactory usineDeSessions = HibernateUtil.getUsineDeSessions();
public void traiterDonnees() {
journal.info("Démarrage du traitement des données des élèves");
try (Session session = usineDeSessions.openSession()) {
journal.debug("Session Hibernate ouverte");
List<Eleve> eleves = session.createQuery("FROM Eleve", Eleve.class).list();
journal.info("Nombre d'élèves récupérés : " + eleves.size());
// ... traitement supplémentaire
} catch (Exception e) {
journal.error("Erreur lors du traitement des données", e);
}
}
}
Après exécution, les messages de log seront affichés dans la console selon le niveau configuré (DEBUG, INFO, ERROR) et également enregistrés dans le fichier logs/application.log.