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 :

[HB/MySQL]SocketException après longue inactivité


Sujet :

Hibernate Java

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut [HB/MySQL]SocketException après longue inactivité
    Bonjour à tous,

    j'utilise hibernate et je suis face à un petit problème. Au bout d'un certain temps d'inactivité sur mon site (disons, une dizaine d'heures), chaque nouvelle tentative de connexion me renvoie l'exception suivante:
    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
     
    08:33:38,890 ERROR JDBCExceptionReporter:78 - Communications link failure due to underlying exception: 
     
    ** BEGIN NESTED EXCEPTION ** 
     
    java.net.SocketException
    MESSAGE: Software caused connection abort: socket write error
     
    STACKTRACE:
     
    java.net.SocketException: Software caused connection abort: socket write error
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(Unknown Source)
        at java.net.SocketOutputStream.write(Unknown Source)
        at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
        at java.io.BufferedOutputStream.flush(Unknown Source)
        ...
    ** END NESTED EXCEPTION **
    Last packet sent to the server was 0 ms ago.
    Pourtant, j'utilise bien un pool de connexion autre que celui par défaut (dbcp). Voici une partie de mon fichier hibernate.cfg.xml:

    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
     
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost/test?autoReconnect=true</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">root</property>
            <property name="hibernate.connection.pool_size">10</property>
            <property name="transaction.auto_close_session">true</property>
            <property name="show_sql">false</property>
            <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
     
            <property name="org.hibernate.tool.hbm2ddl">true</property>
            <property name="hibernate.hbm2ddl.auto">update</property>
            <property name="myeclipse.connection.profile">MySQL local</property>
            <property name="connection.url">jdbc:mysql://localhost/test?autoReconnect=true</property>
            <property name="connection.username">****</property>
            <property name="connection.password">****</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
     
            <!--### Apache DBCP Connection Pool ###-->
            <!--connection pool-->
            <property name="hibernate.dbcp.maxActive">10</property>
            <property name="hibernate.dbcp.whenExhaustedAction">1</property>
            <property name="hibernate.dbcp.maxWait">20000</property>
            <property name="hibernate.dbcp.maxIdle">10</property>
     
            <!-- prepared statement cache-->
            <property name="hibernate.dbcp.ps.maxActive">10</property>
            <property name="hibernate.dbcp.ps.whenExhaustedAction">1</property>
            <property name="hibernate.dbcp.ps.maxWait">20000</property>
            <property name="hibernate.dbcp.ps.maxIdle">10</property>
     
            <!-- optional query to validate pooled connections:-->
            <property name="hibernate.dbcp.validationQuery">select 1</property>
            <property name="hibernate.dbcp.testOnBorrow">true</property>
            <property name="hibernate.dbcp.testOnReturn">true</property>
            <!--### END OF Apache DBCP Connection Pool ###-->
    Pourtant, cette configuration semble n'avoir aucune influence....

    Une idée ?
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Le problème vient de la configuration de mySQL.
    Par défaut, au bout de 8h (me semble t-il), il y a un timeout sur la connexion.

    Je ne suis pas sûr que ça fonctionne, mais essaye de rajouter la ligne suivante dans le fichier my.ini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    [client]
    port=3306
    connect-timeout=864000
    ...
    Là, ça ferait 10 jours de délai d'inactivité...

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    946
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 946
    Points : 1 849
    Points
    1 849
    Par défaut
    Mais ça ne fait que reporter le problème, non?

    Autres solutions :
    Intercepter cette exception grâce à un try catch, fermer l'ancienne connexion et en ouvrir une autre.

    Créer un timer quand vous vous connectez. A chaque requête, le remettre à zéro. Au bout d'un temps d'inactivité trop long, fermer la session. La réouvrir pour la requête suivante.

    Fermer la connexion quand on n'en a plus besoin.

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    hum... j'ai pas vraiment de contrôle sur ce fichier... je suis chez un hébergeur
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par BugFactory Voir le message
    Autres solutions :
    Waou.... niveau bidouillage c'est pas mal du tout, mais dans la vraie vie ça me ferait mal de faire un truc pareil...

    Et puis, fermer la session, c'est déjà fait... Je la ferme à chaque fin de transaction... C'est apparament la connexion du pool qui finit dans les choux...

    Malgré le "autoReconnect=true"...
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BugFactory Voir le message
    Intercepter cette exception grâce à un try catch, fermer l'ancienne connexion et en ouvrir une autre.
    Ça ne règle pas le problème, du-moins si c'est le même que celui que j'avais.
    Le problème est plus loin, tu n'arrives même plus à ouvrir une nouvelle connexion une fois que c'est arrivé, comme s'il y avait un tuyau entre le pool de connexion et la db, le tuyau est là, mais y a plus personne au bout !

    Je sais qu'il y avait déjà un post sur le forum java à ce sujet, mais je n'arrive plus à le retrouver.
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Points : 191
    Points
    191
    Par défaut
    Les gestionnaires de pool de connexion des serveurs d'application comme weblogic, peuvent être configurés simplement de manière à tester périodiquement la validité des Connection et les recréer automatiquement si elles sont invalidés.
    Tu peux configurer ton pool pour avoir un fonctionnement analogue. D'ailleurs cela semble être le cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            <!-- optional query to validate pooled connections:-->
            <property name="hibernate.dbcp.validationQuery">select 1</property>
            <property name="hibernate.dbcp.testOnBorrow">true</property>
            <property name="hibernate.dbcp.testOnReturn">true</property>
            <!--### END OF Apache DBCP Connection Pool ###-->
    Par contre ta requete de validation me semble supecte : select 1
    Cela n'est à priori pas un requete sql valide
    Remplace là par une requete qui fonctionne dans ton appli et qui est EXTREMENT RAPIDE.

  8. #8
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    select 1 est parfaitement valide, elle renvoie 1 et c'est la plus rapide qui soit, même pas besoin de connaître le nom de la base/table à tester...
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  9. #9
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    select 1 est parfaitement valide, elle renvoie 1 et c'est la plus rapide qui soit, même pas besoin de connaître le nom de la base/table à tester...
    +1
    le problème n'est pas la requête... d'ailleurs je ne sais pas d'où vient le problème, il n'est toujours pas résolu... Mais comme on est encore en phase de dév, ce n'est pas vraiment urgent...
    Si quelqu'un a une idée, elle est plus que bienvenue

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  10. #10
    Candidat au Club
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    T'es tu penché sur les pools de connexion C3PO ?

  11. #11
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Pas encore... j'ai juste essayé avec dbcp.

    Mais c'est vrai que je pourrais tester
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  12. #12
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Apparement ça marche beaucoup mieux avec C3PO

    et il me semble avoir lu quelque part qu'il faut configurer un data source dans tomcat pour pouvoir utiliser DBCP (chose que je n'avais pas fait)

    cela semble résolu en tout cas
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

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

Discussions similaires

  1. Reprise du travail après longue interruption
    Par AnneFM dans le forum Emploi
    Réponses: 2
    Dernier message: 17/12/2007, 17h51
  2. [MYSQL5-Tomcat] SocketException après quelques heures
    Par castrogne dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 06/08/2007, 16h58
  3. fermer le prog apres une inactiviter
    Par lassmust dans le forum Langage
    Réponses: 2
    Dernier message: 05/04/2006, 13h37

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