IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Comment catcher une Hibernate Exception à la connection ?


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut Comment catcher une Hibernate Exception à la connection ?
    Bonsoir,

    Je débute en Hibernate mais je pensais quand même être capable de catcher l'exception que peut déclencher Hibernate lorsqu'il n'arrive pas à établir une connection. Bien évidemment, ça n'est pas le cas ...
    Je veux volontairement tester ce cas, pouvoir déclencher l'erreur. Je la vois bien affichée dans la stack mais sans pouvoir l'attraper au vol. Et bien évidemment, ça coince un peu plus loin ...

    Je vous envoie ci-dessous le code qui me permet d'ouvrir la connection et la stack que cela génère.
    Si quelqu'un avait la gentillesse de prendre quelques minutes pour m'aiguiller ...

    Merci d'avance et bonne soirée.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    public class HibernateUtils {
     
        private static final SessionFactory sessionFactory;
        private static boolean sessionValide = false;
     
     
        static {
            try {
                //Récupération des paramètres de la connexion à la base de données
     
                String databaseUserName = System.getProperty("databaseUserName");
                String databaseUrl = System.getProperty("databaseUrl");
                String databaseClass = System.getProperty("databaseClass");
                String databaseDialect = System.getProperty("databaseDialect");
     
                Configuration cfg = new Configuration();
                if ((databaseUserName != null) && (databaseUrl != null) && (databaseClass != null) && (databaseDialect != null)) {
                    System.out.println("Chargement des paramètres de connexion à la base de la servlet");       
                    cfg.setProperty("hibernate.dialect", databaseDialect);
                    cfg.setProperty("hibernate.connection.driver_class", databaseClass);
                    cfg.setProperty("hibernate.connection.url", databaseUrl);
                    cfg.setProperty("hibernate.connection.username", databaseUserName);
                    cfg.setProperty("hibernate.connection.password", System.getProperty("databasePassword"));
                    cfg.addResource("com/pba/mes/reprise/bo/XwfSaisieReprises.hbm.xml");
                    cfg.addResource("com/pba/mes/reprise/bo/XwfInterfaceMes.hbm.xml");
                } else {
                    System.out.println("Chargement des paramètres de connexion à la base du fichier hbm.xml");
                    cfg.configure("hibernate.cfg.xml");
                }
                sessionFactory = cfg.buildSessionFactory();
                sessionValide = true;
            } catch (Exception ex) {
                System.out.println(" erreur session Factory : " + ex.getMessage());
                sessionValide = false;
                throw new RuntimeException("Configuration problem: " + ex.getMessage(), ex);
            } 
        }
        public static final ThreadLocal session = new ThreadLocal();
     
        public static boolean isSessionValide() {
            return sessionValide;
        }
     
        public static Session currentSession() throws HibernateException, Exception {
            if (sessionValide) {
                Session s = (Session) session.get();
                // Open a new Session, if this Thread has none yet
                if (s == null) {
                    s = sessionFactory.openSession();
                    session.set(s);
                }
                return s;
            } else {
     
                throw new Exception("La session n'est pas valide");
            }
        }
     
        public static void closeSession() throws HibernateException {
            Session s = (Session) session.get();
            session.set(null);
            if (s != null) {
                s.close();
            }
        }
    }
    22 avr. 2009 18:55:55 org.hibernate.cfg.Environment <clinit>
    INFO: Hibernate 3.0.5
    22 avr. 2009 18:55:55 org.hibernate.cfg.Environment <clinit>
    INFO: hibernate.properties not found
    22 avr. 2009 18:55:55 org.hibernate.cfg.Environment <clinit>
    INFO: using CGLIB reflection optimizer
    22 avr. 2009 18:55:55 org.hibernate.cfg.Environment <clinit>
    INFO: using JDK 1.4 java.sql.Timestamp handling
    Chargement des paramètres de connexion à la base du fichier hbm.xml
    22 avr. 2009 18:55:55 org.hibernate.cfg.Configuration configure
    INFO: configuring from resource: hibernate.cfg.xml
    22 avr. 2009 18:55:55 org.hibernate.cfg.Configuration getConfigurationInputStream
    INFO: Configuration resource: hibernate.cfg.xml
    22 avr. 2009 18:55:55 org.hibernate.cfg.Configuration addResource
    INFO: Mapping resource: com/pba/mes/reprise/bo/XwfSaisieReprises.hbm.xml
    22 avr. 2009 18:55:55 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
    INFO: Mapping class: com.pba.mes.reprise.bo.XwfSaisieReprises -> XWF_SAISIE_REPRISES
    22 avr. 2009 18:55:55 org.hibernate.cfg.Configuration addResource
    INFO: Mapping resource: com/pba/mes/reprise/bo/XwfInterfaceMes.hbm.xml
    22 avr. 2009 18:55:55 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
    INFO: Mapping class: com.pba.mes.reprise.bo.XwfInterfaceMes -> XWF_FICHIERS_MES
    22 avr. 2009 18:55:55 org.hibernate.cfg.HbmBinder bindCompositeId
    ATTENTION: Could not perform validation checks for component as the class com.pba.mes.reprise.bo.PkXwfInterfaceMes was not found
    22 avr. 2009 18:55:55 org.hibernate.cfg.Configuration doConfigure
    INFO: Configured SessionFactory: null
    22 avr. 2009 18:55:55 org.hibernate.cfg.Configuration secondPassCompile
    INFO: processing extends queue
    22 avr. 2009 18:55:55 org.hibernate.cfg.Configuration secondPassCompile
    INFO: processing collection mappings
    22 avr. 2009 18:55:55 org.hibernate.cfg.Configuration secondPassCompile
    INFO: processing association property references
    22 avr. 2009 18:55:55 org.hibernate.cfg.Configuration secondPassCompile
    INFO: processing foreign key constraints
    22 avr. 2009 18:55:55 org.hibernate.connection.DriverManagerConnectionProvider configure
    INFO: Using Hibernate built-in connection pool (not for production use!)
    22 avr. 2009 18:55:55 org.hibernate.connection.DriverManagerConnectionProvider configure
    INFO: Hibernate connection pool size: 20
    22 avr. 2009 18:55:55 org.hibernate.connection.DriverManagerConnectionProvider configure
    INFO: autocommit mode: false
    22 avr. 2009 18:55:55 org.hibernate.connection.DriverManagerConnectionProvider configure
    INFO: using driver: oracle.jdbc.driver.OracleDriver at URL: jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = lyossunoraa-dev-toto)(PORT = 1523)))(CONNECT_DATA =(SERVICE_NAME = lyoorab3.asterion.fr)))
    22 avr. 2009 18:55:55 org.hibernate.connection.DriverManagerConnectionProvider configure
    INFO: connection properties: {user=XWF, password=****}
    22 avr. 2009 18:55:55 org.hibernate.cfg.SettingsFactory buildSettings
    ATTENTION: Could not obtain connection metadata
    java.sql.SQLException: Exception d'E/S: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:161)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:273)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:321)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:346)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:149)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:31)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:543)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:154)
    at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:72)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:1463)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1004)
    at com.pba.utils.HibernateUtils.<clinit>(HibernateUtils.java:42)

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par lilas14 Voir le message
    Bonsoir,

    Je débute en Hibernate mais je pensais quand même être capable de catcher l'exception que peut déclencher Hibernate lorsqu'il n'arrive pas à établir une connection. Bien évidemment, ça n'est pas le cas ...
    Je veux volontairement tester ce cas, pouvoir déclencher l'erreur. Je la vois bien affichée dans la stack mais sans pouvoir l'attraper au vol. Et bien évidemment, ça coince un peu plus loin ...

    Je vous envoie ci-dessous le code qui me permet d'ouvrir la connection et la stack que cela génère.
    Si quelqu'un avait la gentillesse de prendre quelques minutes pour m'aiguiller ...

    Merci d'avance et bonne soirée.
    on n'a pas déjà posé cette question dans un des forums persistence ?

    de mémoire : est-ce la connection ne se fait pas dans un thread secondaire et que c'est là que l'exception est levée ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut Catch d'exception àa l'ouverture d'une connection hibernate
    J'ai essayé de regarder sur le forum, mais je n'ai pas trouvé de discussion sur ce sujet. Je m'y prends sans doute mal avec la recherche ?
    Et en effet, si c'est un thread secondaire qui lance l'exception, je ne vois pas bien comment l'attraper ...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut Catch d'exception à l'ouverture d'une connection Hibernate
    Les messages que je trouve sur le forum concernent en général des gens qui veulent ouvrir une connection mais n'y arrivent pas.
    Moi j'ouvre ma connection sans problème. Mais si pour une raison ou une autre (listener oracle non démarré, serveur éteint, problème réseau ... ) on n'arrive pas à accéder à la base, j'aimerai pouvoir attraper l'exception relevée pour indiquer un message à l'utilisateur. Actuellement, ça crashe sur la première requête que j'envoie, c'est pas très clean ...

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    C'est ta méthode currentSession() qui te renvoie l'erreur ?
    A un moment dans ton code, il faut que tu catches l'exception.
    J'imagine que tu ne le fais pas, non ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Comme tu peux le voir dans le code, je catche dans la méthode statique, lors de l'établissement de la connection :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
        static {
            try {
                //Récupération des paramètres de la connexion à la base de données
     
                String databaseUserName = System.getProperty("databaseUserName");
                String databaseUrl = System.getProperty("databaseUrl");
                String databaseClass = System.getProperty("databaseClass");
                String databaseDialect = System.getProperty("databaseDialect");
     
                Configuration cfg = new Configuration();
                if ((databaseUserName != null) && (databaseUrl != null) && (databaseClass != null) && (databaseDialect != null)) {
                    System.out.println("Chargement des paramètres de connexion à la base de la servlet");       
                    cfg.setProperty("hibernate.dialect", databaseDialect);
                    cfg.setProperty("hibernate.connection.driver_class", databaseClass);
                    cfg.setProperty("hibernate.connection.url", databaseUrl);
                    cfg.setProperty("hibernate.connection.username", databaseUserName);
                    cfg.setProperty("hibernate.connection.password", System.getProperty("databasePassword"));
                    cfg.addResource("com/pba/mes/reprise/bo/XwfSaisieReprises.hbm.xml");
                    cfg.addResource("com/pba/mes/reprise/bo/XwfInterfaceMes.hbm.xml");
                } else {
                    System.out.println("Chargement des paramètres de connexion à la base du fichier hbm.xml");
                    cfg.configure("hibernate.cfg.xml");
                }
                sessionFactory = cfg.buildSessionFactory();
                sessionValide = true;
            } catch (Exception ex) {
                System.out.println(" erreur session Factory : " + ex.getMessage());
                sessionValide = false;
                throw new RuntimeException("Configuration problem: " + ex.getMessage(), ex);
            } 
        }
    Enfin du moins, je m'attendais à ce que l'exception soit catchée là. Or le message que je renvoie n'apparaît jamais. Et j'ai bien une HibernateException qui se déclenche pourtant ...

    On m'a déjà proposé de lancer une requête "test" pour voir si la connection est bien établie. Effectivement, dans ce cas, je vais pouvoir catcher l'exception. Mais le message que je remonte est moins détaillé du coup.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Oui ok tu catches dans le bloc static, mais imaginons que le passage dans ce bloc se passe bien, puis, tu veux exécuter une requête et là, la base n'est plus accessible. C'est donc bien ta méthode currentSession qui va générer l'exception, mais tu ne la catches pas.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Yep yep yep, je n'avais pas compris ce que tu voulais dire, excuse moi.

    En effet je ne la catche pas directement dans currentSession parce que je veux justement qu'elle remonte pour que je puisse l'attraper au niveau de la couche graphique. Et à ce niveau là, ça fonctionne bien. En l'occurrence, quand la connection ne s'établit pas, l'erreur remonte bien au premier envoi de requête.

    C'est uniquement celle de la méthode statique que je n'arrive pas à attraper. On la voit bien dans la stack (c'en est même frustrant), mais sans pouvoir l'attraper au vol.
    Or j'aimerai bien, dès le démarrage de mon appli, indiquer qu'on ne peut pas accéder à la base avec le message qui va bien.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    pardon : BLOC static. Et non méthode ...

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Dans ce cas, je mettrais le code qui est dans ton bloc static dans une méthode que j'appellerais par exemple au lancement de l'application, puis je testerais le retour de cette méthode pour savoir si l'accès à la base est possible ou non.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Ouaip, j'en venais à la même conclusion ... et en fait, ma sessionFactory ne doit plus être final ...
    Finalement, avec juste cette petite correction de "bloc static" et non "méthode statique", ça change tout ...

    Merci pour ton aide.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Dommage ... l'idée aurait pu être bonne mais même en faisant tout ça (sessionFactory en non final, méthode statique d'initialisation remontant l'erreur et catch au premier appel de cette fonction), je n'arrive toujours pas à catcher l'erreur.

    Donc je pense que je vais bêtement essayer, juste après l'initialisation de ma connection, de lancer une requête. Puisque à ce moment là j'arrive à attraper l'erreur.

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    En fait, la création de la sessionFactory ne demande pas de connexion à la base de données.
    C'est bien ton currentSession() qui va te générer l'exception.
    Il faut donc récupérer l'exception de cette méthode pour voir si la base est accessible.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Yep, ça marche cette fois.
    Merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment catcher dynamiquement une exception à la demande?
    Par jlassiramzy dans le forum Langage
    Réponses: 5
    Dernier message: 06/04/2011, 10h29
  2. [EJB3] Comment catcher une erreur de connexion à la base de données
    Par chriscoolletoubibe dans le forum Java EE
    Réponses: 5
    Dernier message: 03/01/2011, 10h59
  3. Comment configurer une DataSource pour se connecter à AS400
    Par the watcher dans le forum Websphere
    Réponses: 5
    Dernier message: 14/09/2010, 19h59
  4. Comment catcher org.hibernate.util.JDBCExceptionReporter
    Par jemini_fr dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/01/2008, 14h05
  5. [Exception] Comment catcher une runtime exception ?
    Par bulbo dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 16/06/2005, 09h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo