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] Insertion massive de données qui prend un temps important


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2004
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 183
    Par défaut [PreparedStatement] Insertion massive de données qui prend un temps important
    Bonjour,

    J'ai une insertition massive d'information provenant d'une table vers une table temporaire

    La requête insert 280 000 lignes.

    Si je l'execute depuis MySQL avec la commande INSERT ... SELECT ça prends 11 secondes

    Si je le programme en JAVA (avec des PreparedStatement) j'en ai pour 10 MIN !!!

    Quelqu'un peut m'aider afin que cela soit fait en Java mais rapidement ?
    Merci

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Si les deux tables sont sur le même serveur, tu peux utiliser la syntaxe :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO laTableTemp
    SELECT lesColonnes
    FROM laTableSource
    En préfixant éventuellement le nom des tables par le nom de la base de données si ce n'est pas la même.

    Si elles sont sur deux serveurs différents, tu peux utiliser le couple SELECT INTO OUTFILE / LOAD DATA INFILE qui transfère les données dans un fichier texte puis récupère ces données à partir du fichier texte généré à la première étape.


    Si c'est purement un problème Java ==> Forum Java.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Montre nous ton code java.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2004
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 183
    Par défaut
    VOila mon 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
    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
     
    //..
     
    ResultSet result = statement.executeQuery(sql2+ " LIMIT "+ind+","+paquet);
    	String insert = "insert into tablesTemporaire.T7951254728407921N207(`clients.ville`,`clients.nom`,`polices.ancpolice`,`polices.police`,`polices.compagnie`,`flottes_principal.id_flottes`,`flottes_principal.type`,`flottes_principal.prim_an_ttc`,`flottes_principal.num_police`,`polices.coderisque`,`polices.garanties`,`flottes_principal.prim_an_ht`,`flottes_principal.etat`,`clients.numclient`,`clients.lienclient`,`polices.id`,`flottes_param.champ14`,`flottes_param.champ0`,`flottes_param.champ1`,`flottes_param.champ2`,`flottes_param.champ12`,`flottes_param.champ15`,`flottes_param.champ16`,`flottes_param.champ17`,`flottes_param.champ56`,`flottes_param.champ53`,`flottes_param.champ57`,`flottes_param.champ55`,`flottes_param.champ52`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    	con2.setAutoCommit(false);
    	PreparedStatement preparedStatement = con2.prepareStatement(insert);
    	while(result.next()){
    		preparedStatement.setString(1, result.getString(1));
    		preparedStatement.setString(2, result.getString(2));
    		preparedStatement.setString(3, result.getString(3));
    		preparedStatement.setString(4, result.getString(4));
    		preparedStatement.setString(5, result.getString(5));
    		preparedStatement.setInt(6, result.getInt(6));
    		preparedStatement.setString(7, result.getString(7));
    		preparedStatement.setDouble(8, result.getDouble(8));
    		preparedStatement.setString(9, result.getString(9));
    		preparedStatement.setString(10, result.getString(10));
    		preparedStatement.setString(11, result.getString(11));
    		preparedStatement.setDouble(12, result.getDouble(12));
    		preparedStatement.setString(13, result.getString(13));
    		preparedStatement.setLong(14, result.getLong(14));
    		preparedStatement.setInt(15, result.getInt(15));
    		preparedStatement.setInt(16, result.getInt(16));
     
    		preparedStatement.setString(17,"");
    		preparedStatement.setString(18,"");
    		preparedStatement.setString(19,"");
    		preparedStatement.setString(20,"");
    		preparedStatement.setString(21,"");
    		preparedStatement.setString(22,"");
    		preparedStatement.setString(23,"");
    		preparedStatement.setString(24,"");
    		preparedStatement.setString(25,"");
    		preparedStatement.setString(26,"");
    		preparedStatement.setString(27,"");
    		preparedStatement.setString(28,"");
    		preparedStatement.setString(29,"");
     
    		preparedStatement.addBatch();
    	       // commit toutes les 100 insertions
     
    		nb++;
     
    		if((nb % 100) == 0) {
    	    	preparedStatement.executeBatch();
    	        con2.commit();
    		}
     
    		if(nb == paquet){
    			ind += paquet;
    			result = statement.executeQuery(sql2+ " LIMIT "+ind+","+paquet);
    			nb = 0;
    		}
    	}
     
        preparedStatement.executeBatch();
        con2.commit();
     
    //..

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2004
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 183
    Par défaut
    Bon plus de réponses j'ai beau creuser je vois rien qui remplace le traitement effectue par la bdd avec le insert select

  6. #6
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Y a quelque chose que je comprend pas... Pourquoi ne pas simplement balancer ton "insert into ... select" dans ton code java, au lieu de récupérer un à un chaque ligne, de recréer une à une des requêtes et de les envoyer une à une ?

    Tu perds toute l'optimisation mysql en faisant ça, c'est pas étonnant que ça prenne 10 fois plus de plombes, t'as autant de requêts en plus...

    Au lieu d'avoir 1 requête que mysql peut optimiser, tu as:

    280 000 / 100 = 2800 requêtes de selection
    + 280 000 requêtes d'insertion
    = 282 800 requêtes.

    C'est un peu comme déplacer un sac de 300 000 graines, graine par graine.

Discussions similaires

  1. Base de données qui plante de temps en temps
    Par engi dans le forum Firebird
    Réponses: 11
    Dernier message: 21/01/2015, 12h03
  2. méthode qui prend du temps et la main
    Par petitours dans le forum C#
    Réponses: 1
    Dernier message: 06/02/2012, 23h01
  3. Réponses: 2
    Dernier message: 05/05/2009, 11h39
  4. Problème d'insertion massive de données
    Par donnadieujulien dans le forum DB2
    Réponses: 9
    Dernier message: 09/09/2008, 22h40
  5. sous requete qui prend du temps
    Par abdoing dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 30/07/2007, 10h24

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