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 :

Driver JDBC et Oracle - select très long


Sujet :

JDBC Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Driver JDBC et Oracle - select très long
    Bonjour,

    Dans le cadre d'un changement de driver JDBC éventuel (celui utilisé actuellement étant vieux, je suis actuellement en train de tester les performances du driver JDBC pour oracle.
    Cependant, lors d'un test, 1000 selects (sur un table contenant 100 lignes) prennent plus de 50s à être exécutés.
    Cela me parait énorme ca en comparaison 1000 inserts prennent environ 1s.

    Avez-vous rencontré ce genre de problème ?
    Avez-vous des pistes de recherche ?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    fais nous voir ton code

    Ca faire 50ms / select. Ca peux être normal si il y a beaucoup de données à rappatrier, si la requête utilise des formule complexe ou si on a oublier d'indexer les tables.

    A noter qu'en général la performance d'un select et fonctione de la quantité de donnée reçue, pas de la taille de la base de données.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci de la réponse rapide.

    La table ne contient que 1000 lignes.
    Je sélectionne les lignes une par une.
    Le temps d'exécution ne semble pas vraiment varier suivant que je récupère toutes les colonnes ou juste une seule.

    Le temps d'exécution avec le driver Inet Oranxo (une ancienne version) est de 500 ms. C'est pour cette raison que les 50s du driver oracle me paraissent énormes.

    Voici la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     TYPE_NUMBER NUMBER(20)
     TYPE_CHAR CHAR(1)
     TYPE_VARCHAR VARCHAR2(4000)
     TYPE_DATE DATE
     TYPE_CLOB CLOB
     TYPE_BLOB BLOB
     TYPE_RAW RAW(2000)
    Et voici le code d'accès :
    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
     
       public void selectLine(Long number) {
            Connection cx = null;
            PreparedStatement ps = null;
            try {
                String query = "SELECT type_number, type_char, type_varchar, type_date, type_clob, type_blob, type_raw "
                             + " FROM JDBC_DRIVER_BENCHMARK WHERE type_number = ?";
                cx = openConnection();
     
                ps = cx.prepareStatement(query);
                ps.setLong(1, number);
     
                ps.executeQuery().getFetchSize();
            }
            catch (SQLException sqle) {
                throw new QueryException(sqle);
            }
            catch (NamingException e) {
                logger.log("No JDBC connection available from connection pool", Logger.ERROR);
                throw new QueryException(e);
            }
            finally {
                closeConnection(ps, cx);
            }
        }
     
        /**
         * Ouverture d'une connexion JDBC.
         */
        private Connection openConnection() 
        throws NamingException, SQLException {
            DataSource ds = null;
            Context ctx = new InitialContext();
            ds = (DataSource) ctx.lookup("java:/OracleDS");
            return ds.getConnection();
        }
     
        /**
         * Fermeture d'une connexion JDBC.
         */
        private void closeConnection(PreparedStatement ps, Connection cx) {
            if (ps != null) {
                try {
                    ps.close();
                }
                catch (Exception e) {logger.log(Utility.exceptionToString(e), Logger.ERROR);}
            }
            if (cx != null) {
                try {
                    cx.close();
                }
                catch (Exception e) {logger.log(Utility.exceptionToString(e), Logger.ERROR);}
            }
        }

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ca ouvre vraiment une connexion, ou sa reprend un connexion du connexion pool?
    C'est important car l'ouverture d'une connexion, c'est couteux en oracle et il ne m'apparait pas étonnant que oracle mette 50s à créer les 1000 process indépendants chargés de gérer chaque connexion.
    Il est probable que ton autre test utilise une forme de pooling ou de réutilisation de la connexion.


    Bref il faudrait voir la configuration de ton pool et eventuellement y activer le debug

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mai 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    openConnection récupère une connection du pool.
    La méthode est la même pour les deux drivers.

    En fait, pour expliquer plus clairement, j'exécute ces requêtes sur un serveur JBOSS. Le code reste le même d'un driver à l'autre, je modifie uniquement les datasources dans le fichier oracle-ds.xml.

    Pour info, je compare actuellement le dernier driver JDBC de oracle et le dernier driver Oranxo de I-net.
    Les temps d'exécutions ont le même ordre de grandeur sauf pour les selects, le driver JDBC met 100 x plus de temps que le driver Oranxo.

    J'ai peut-être une piste, les options de configurations n'ont pas les mêmes valeurs par défaut chez les deux drivers.
    Par exemple FetchSize :
    • JDBC : 10
    • Oranxo : 256

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    mon projet de fin d’études prote sur l'analyse de performance d'un système utilisant les deux traitement OLAP-OLTP.
    j' ai implémenté un cube avec psw (scema workbenche), maintenant j' essaye de connecter java et le serveur mondrian OLAP qui travaille avec oracle 11g ,mais je trouve pas comment?
    merci d'avance !

Discussions similaires

  1. MYSQL : Premier SELECT très long
    Par re12 dans le forum Requêtes
    Réponses: 58
    Dernier message: 01/06/2012, 08h02
  2. [Perfs] Insert+select très long
    Par farenheiit dans le forum Administration
    Réponses: 39
    Dernier message: 07/08/2009, 14h36
  3. driver JDBC de Oracle
    Par helene_53 dans le forum Oracle
    Réponses: 0
    Dernier message: 14/03/2008, 14h11
  4. problème du driver jdbc pour oracle
    Par soumou dans le forum Oracle
    Réponses: 1
    Dernier message: 05/07/2006, 15h56
  5. [Driver JDBC] Oracle 10g R2 et driver JDBC
    Par max44410 dans le forum Oracle
    Réponses: 4
    Dernier message: 09/12/2005, 18h53

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