Bonjour,
mon problème est le suivant:
[Contexte]
Utilisation d'Hibernate dans une application Java hébergée dans Tomcat.
Base de données utilisée: MySQL.
Fichier de configuration d'hibernate:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <hibernate-configuration> <session-factory> <!-- Use a Tomcat 5.5 JNDI datasource --> <property name="connection.datasource">java:comp/env/jdbc/databaseResource</property> <property name="show_sql">false</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="current_session_context_class">thread</property> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> ....... </session-factory> </hibernate-configuration>
[Problème rencontré]
Lorsque je lance mon application utilisant Hibernate avant que la base de données ne soit lancée des exceptions sont levées (ce qui est normal), mais une fois la base de données lancée il n'y a plus d'exception dans mes transactions mais les données ne sont pas correctement répliquées.
Le lancement de mon application avant la base de données est une contrainte que je dois respecter.
Si jamais le lance la bd avant mon application les données sont correctement répliquées.
Le code que j'utilise pour initialiser hibernate est le suivant:
Une exception est générée lors de l'exécution de la fonction buildSessionFactory(), et je la catche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 /** * Initialisation of the hibernate factory. * * @param confUrl The url where the hibernate configuration can be found * @throws ExceptionInInitializerError Exception thrown if there is an error in the initialisation of the factory */ public HibernateUtil(URL confUrl) throws ExceptionInInitializerError{ if ( sessionFactory == null ){ // Create the SessionFactory from hibernate.cfg.xml sessionFactory = new Configuration().configure(confUrl) .buildSessionFactory(); } }
Voici le contenu de cette exception:
Ainsi mon application se lance malgré cette exception et j'initialise ensuite une session que j'utilise pour réaliser des transactions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 09/04/2010 14:30:04,620 WARN main SettingsFactory:buildSettings() Could not obtain connection to query metadata org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.SocketException MESSAGE: java.net.ConnectException: Connection refused
La réalisation de ces différentes étapes me renvoie des erreurs tant que la base de données n'est pas lancée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 currentSession = HibernateUtil.getSessionFactory().openSession(); //Persistance de mes objets .... //Utilisation de transactions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3org.hibernate.exception.GenericJDBCException: Cannot open connection
ou encore
Après avoir lancé la base de données il n'y a plus d'erreurs mais les données ne sont pas répliquées en base de données lors des transactions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 09/04/2010 14:30:15,646 WARN satcom JDBCExceptionReporter:logExceptions() SQL Error: 0, SQLState: null 09/04/2010 14:30:15,647 ERROR satcom JDBCExceptionReporter:logExceptions() Cannot create PoolableConnectionFactory (Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.SocketException MESSAGE: java.net.ConnectException: Connection refused
J'aurais aimé savoir s'il existe un mécanisme de retry, en particulier au niveau de la fonction buildSessionFactory() ou si jamais vous avez vous même implémenté un mécanisme de retry afin de pouvoir lancer une application utilisant hibernate avant même de lancer la base de données et qu'elle se reprenne une fois la base de données lancée.
Merci d'avance.
Antoine
Partager