Lancement d'une application utilisant Hibernate avant que la base de données soit lancée.
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:
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:
Code:
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();
}
} |
Une exception est générée lors de l'exécution de la fonction buildSessionFactory(), et je la catche.
Voici le contenu de cette exception:
Code:
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 |
Ainsi mon application se lance malgré cette exception et j'initialise ensuite une session que j'utilise pour réaliser des transactions
Code:
1 2 3 4 5 6 7 8
|
currentSession = HibernateUtil.getSessionFactory().openSession();
//Persistance de mes objets
....
//Utilisation de transactions |
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:
1 2 3
|
org.hibernate.exception.GenericJDBCException: Cannot open connection |
ou encore
Code:
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 |
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.
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
separation du server d'application et du server de base de données
Bonjour ,
je voudrais savoir s'il est possible de séparer le server d'application par exemple tomcat 5.5 et e server de bases de données interbase.
je m'explique , j'ai deja developper une application JSF + hibernate + interbase comme base de donnees qui est en ce moment en production , mais ces temps ci j'ai remarqué des lenteurs. je voudrais donc deployer mon tomcat sur une machine N°1 et la base de donnee sur une autre machine N°2 mais en locale.
j'ai modifier le fichier de configuration d'hibernate de sorte que la bases de données point sur la machine N°2.
<property name="connection.url">jdbc:interbase://10.0.0.76/TEST.GDB</property>
mais ca ne fonction pas si quelqu'un pourrait il m'aidé à trouvé une solution ?