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

Développement SQL Server Discussion :

Process JAVA bloqués pendant lecture résultat


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut Process JAVA bloqués pendant lecture résultat
    Bonjour,


    Il y a quelques semaines nous sommes passé de sqljdbc_4.0 à sqljdbc_8.4.
    Tout semble fonctionner correctement, mais aujourd'hui suite à des attaques DDoS subies par notre hébergeur, nous avons eu quelques threads bloqués à ce niveau :


    java.net.SocketInputStream.socketRead0(Native Method)
    java.net.SocketInputStream.socketRead(Unknown Source)
    java.net.SocketInputStream.read(Unknown Source)
    java.net.SocketInputStream.read(Unknown Source)
    com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:2054)
    com.microsoft.sqlserver.jdbc.TDSReader.readPacket(IOBuffer.java:6643)
    com.microsoft.sqlserver.jdbc.TDSReader.nextPacket(IOBuffer.java:6546)
    com.microsoft.sqlserver.jdbc.TDSReader.ensurePayload(IOBuffer.java:6524)
    com.microsoft.sqlserver.jdbc.TDSReader.readBytes(IOBuffer.java:6825)
    com.microsoft.sqlserver.jdbc.TDSReader.readWrappedBytes(IOBuffer.java:6846)
    com.microsoft.sqlserver.jdbc.TDSReader.readUnsignedShort(IOBuffer.java:6773)
    com.microsoft.sqlserver.jdbc.ServerDTVImpl.getValuePrep(dtv.java:3393)
    com.microsoft.sqlserver.jdbc.ServerDTVImpl.getValue(dtv.java:3686)
    com.microsoft.sqlserver.jdbc.DTV.getValue(dtv.java:247)
    com.microsoft.sqlserver.jdbc.Column.getValue(Column.java:190)
    com.microsoft.sqlserver.jdbc.SQLServerResultSet.getValue(SQLServerResultSet.java:2054)
    com.microsoft.sqlserver.jdbc.SQLServerResultSet.getValue(SQLServerResultSet.java:2040)
    com.microsoft.sqlserver.jdbc.SQLServerResultSet.getObject(SQLServerResultSet.java:2372)
    ...



    Voici un extrait de notre code :
    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
        int SQL_QUERY_TIMEOUT = 90;
        Statement instruction = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
        instruction.setQueryTimeout(SQL_QUERY_TIMEOUT);
        ResultSet resultSet = instruction.executeQuery("SELECT * FROM ...");
        if (!resultSet.isBeforeFirst()) {
          return 0;
        }
        ResultSetMetaData resultatMD = resultSet.getMetaData();
        int numberOfColumns = resultatMD.getColumnCount();
        while (resultSet.next()) {
          for (int i = 1; i <= numberOfColumns; i++) {
                Object object = resultSet.getObject(i);
                // ...
          }
        }



    1) Quelqu'un a t'il déjà rencontré ce problème avec sqljdbc_8.4 ?
    2) Existe t-il un moyen de l'éviter ?
    3) Est-ce que ces connexions fantômes sont identifiables coté SQL server ?


    Merci d'avance pour votre aide,
    Frédéric.

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    La stack que tu donnes ne montre pas clairement l'erreur que tu as. Tu n'aurais pas un java.net.SocketException quelque part ?

    Si ton hébergeur subit des attaques DDos alors il y a forte chance que côté serveur ta connexion soit subitement déconnectée ...

    Au niveau du code java je ne vois rien de spécial en tout cas

    ++

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Cette stack n'est pas issue d'une exception.
    J'utilise ceci pour voir ou les Threads sont bloqués :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();
    Il y a des threads qui sont restés bloqués presque 2 heures sur getObject().

    Tout a été débloqué, mais pour l'instant je n'en connais pas la raison.
    Je ne sais pas si c'est lié à un timeout de la config de SQL server ou si c'est un DBA qui est intervenu...

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Petite spéculation dans ce cas:

    1) Possible que tu es eu des sessions bloqués à ce moment là et que le DBA ait résolu le problème.

    Tu peux voir les sessions bloqués avec la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select 
     status,
     command,
     blocking_session_id,
     last_wait_type,
     wait_type
    from
    sys.dm_exec_requests
    Pour le timeout, c'est un paramètre côté client et tu devrais en principe avoir un message assez explicite au niveau de ta stack si c'était le cas.

    2) Avec une attaque DDoS possible aussi que ton serveur SQL ait manqué de threads de travail ...

    Tu peux avoir un message dans l'erreur log SQL avec un peu de chance.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    D'après mon hébergeur, ils ne sont pas intervenus sur la BDD (Mais je n'en ai pas la certitude…).

    Merci pour la requête SQL. Je la garde sous le coude au cas ou le problème se reproduit.

    Quel est le paramètre coté client permettant de positionner un timeout pour la lecture du résultat ?
    Le seul timeout que je positionne est celui pour exécuter la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    instruction.setQueryTimeout(SQL_QUERY_TIMEOUT);

    Je vais leur demander "l'erreur log SQL". On verra ce que je vais obtenir…[/FONT]

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    J'ai trouvé comment positionner un timeout sur la socket :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DriverManager.getConnection(url+";socketTimeout=3600000", user, password);
    Apparemment ça fonctionne depuis la sqljdbc_6.1.2.

Discussions similaires

  1. Obtenir le PID du process java
    Par manutudescends dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2006, 18h25
  2. [SAX] Java : problème de lecture d'XML avec SAX
    Par TheReturnOfMuton dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 22/06/2006, 18h26
  3. [SGBD/JDBC] [JAVA/MS ACCESS] problème résultat requête
    Par mouuaahh dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 04/04/2006, 10h31
  4. Réponses: 16
    Dernier message: 03/11/2005, 19h33
  5. [EMF] Java pour la lecture d'EMF
    Par deepfred dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 22/04/2005, 15h39

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