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

JDBC Java Discussion :

PreparedStatement et performances


Sujet :

JDBC Java

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Points : 338
    Points
    338
    Par défaut PreparedStatement et performances
    Bonjour,

    J'ai toujours entendu dire qu'utiliser des PreparedStatement permettait d'améliorer les temps d'exécution des requêtes grâce à la précompilation (si le driver la supporte).
    Je ne doute pas que ça soit vrai dans un cas comme celui ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PreparedStatement ps = connection.prepareStatement("SELECT ...");
      for (...) {
        // set des paramètres
        ps.setObject(...);
        // exécution
        ResultSet rs = ps.executeQuery();
        //exploitation du résultat
        ...;
      }
    mais si l'instance de PreparedStatement n'est utilisée qu'une seule fois, par exemple:
    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
    void methodA() {
    for (int i=...) {
      ResultSet rs = methodB(i);
      //exploitation du résultat
      ...;
    }
    }
     
    void methodB(int param) {
      PreparedStatement ps = connection.prepareStatement("SELECT ...");
      // set des paramètres
      ps.setObject(param...);
      // exécution
      return ps.executeQuery();
    }
    est-ce que c'est toujours le cas ?

    J'ai (beaucoup) simplifié le code ci-dessus, car je me pose la question d'un point de vue théorique. Je sais qu'il faut libérer les ressources, etc. Je sais aussi qu'il ne faut pas chercher à optimiser avant d'avoir des problèmes de performance: je veux juste savoir si dans la façon de faire du deuxième cas les PreparedStatement sont pertinents.

    Au passage il s'agit d'une connexion à une base DB2...

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par -gma- Voir le message
    je veux juste savoir si dans la façon de faire du deuxième cas les PreparedStatement sont pertinents.
    A partir du moment où ta requête est paramétré, le PreparedStatement est le plus pertinent.


    Coté performance, je ne pense pas que ceci puisse avoir une influence réelle sur une seule requête...


    a++

  3. #3
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Il y a plusieurs réponses possibles à la question des performances sur ce sujet.

    D'une manière générale, les DBA préféreront avoir une seule query, avec des Bind Variables. C'est plus facile à tracer, plus facile en général à optimiser, et on gagne sur le hard parsing.

    En particulier, si ta requête est complexe, le temps de hard parsing peut ne pas être négligeable ; même si tu n'es pas au niveau applicatif dans une boucle au moment même de l'exécution, rien n'empêche que la requête soit générée beaucoup, beaucoup de fois (avec des valeurs différentes).

    Par contre, ça nécessite d'avoir du Bind Variable Peeking de bonne tenue ! Sinon des cas pathologiques (typiquement sur des colonnes avec des répartitions peu homogènes) risquent de plomber les performances. Là c'est du domaine du SGBD, et parfois il n'y a pas de bonne solution !

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Points : 338
    Points
    338
    Par défaut
    Merci pour vos réponses.

    Je vais utiliser les PreparedStatement pour le moment et je verrai au cas par cas si mes amis les DBA me cassent les pieds

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

Discussions similaires

  1. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39
  2. Performance xml
    Par MicKCanE dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 07/07/2003, 06h41
  3. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

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