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 :

Ecriture dans une base données MySql qui prend beaucoup de temps


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 61
    Points
    61
    Par défaut Ecriture dans une base données MySql qui prend beaucoup de temps
    Bonjour

    Voila tous et dans le titre j'ai créer une petite méthode qui insert des ligne dans une base de données ma ça prend 10 sec pour insérer 800 ligne je trouve ça trop long :!!!!!
    mais le problème j'arrive pas à comprendre c'est quoi qui prend aussi de temps que ça ??
    voici mon programme :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    package test;
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.Locale;
     
    public class Test2 {
     
    	static String url = "jdbc:mysql://localhost:3306/magmatic";// URL de connexion
    	static String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
    	static Connection con = null;
    	static Locale locale = Locale.getDefault();
     
    	 public Test2(){
     
    					// Connexion a la base de données 
    					try {
     
    						Class.forName(driver);
    						con = DriverManager.getConnection(url,"root","admcira");
     
    						} catch (SQLException e) {
    							System.out.println("Echec d'ouverture:"+e.getMessage());
    						}catch (ClassNotFoundException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
     
    	}
     
    	 public static String Date(){
     
     
     
    	    	Date date = new Date();
    	    	DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    	    	String dat = dateFormat.format(date);
     
     
    	    	return dat;
    	    }
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
     
    				Test2 T2 = new Test2();
    				byte[] test_tab = new byte[800];
     
    				String Nom_API = "Nord";
     
     
    				Statement stmt = null;
    				stmt = con.createStatement();	
    				try{
    						// afficher le Temps au début du programme 
    						System.out.println(Date());
    						for (int i = 0; i < 800; i++){
     
    							String sqlUpdate = "Insert into T1 (Nom_API,Valeur,Id) Values ('Nord','" + 5 + "'," + i + ")";
    							//String sqlUpdate = "Update  T1 Set Valeur = " + 5 + ",Nom_API = '" + Nom_API +
    							// 					"' where (Id = " + i + ")";
     
    							//System.out.println(sqlUpdate);
    							stmt.executeUpdate(sqlUpdate);
    						}
    				}finally{
    					stmt.close();
    				}
    				// afficher le Temps a la fin du programme 
    				System.out.println(Date());
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
     
    	}
     
    }
    Merci d'avance pour votre aide

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	static String url = "jdbc:mysql://localhost:3306/magmatic";// URL de connexion
    	static String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
    Ces deux là me font me poser des questions. Tu accède par odbc ou par le driver sql?? Parce que ton choix de driver sous entends odbc (qu'il n'est pas recommandé d'utiliser) alors que ton url suggère mysql (mais sans déclarer le driver mysql). Je te recommande de te débarasser de odbc et de passer par le driver mysql (que tu trouvera sur le site de mysql)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 61
    Points
    61
    Par défaut
    merci pour ta réponse

    mais j'ai pas trop compris comment je peut me connecté sans le driver ODBC??

    si je me débarrasse de se driver donc je le remplace comment par le driver de Mysql ??

    tu peut me donné un exemple STP ou de changer sur mon programme pour utilisé se driver Mysql au lieu de Odbc

    merci encore une fois pour ton aide

  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
    pour le driver jdbc mysql, tu le trouvera sur le site de mysql (une simple recherche sur jdbc et t'aura vraisemblablement le driver et peut-être aussi des exemple. Tu trouvera d'autres exemples dans la faq jdbc: http://java.developpez.com/faq/jdbc

    la page sur le site de mysql (anglais): http://dev.mysql.com/doc/refman/5.0/...reference.html

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 61
    Points
    61
    Par défaut
    dsl de remonté se sujet mais j'ai pas encore trouvé de solution pour se probleme que je trouve vraiment bizard.
    là j'ai essayé une application java qui modifier des données dans une base Access alors ça prend pas dutout de temps meme pas 1sec

    alors que mon application en java avec MySQL ça prend plus que 10 sec pour un Update de 400 ligne pour une seule table ?!!!!!!

    donc est ce que vous pouvez me dire il est ou le probleme dans mon code SVP ou sinon est ce que c'est normale qu'il prend aussi de temps que ça ??

    merci

  6. #6
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Salut, j'ai moi aussi eu un probleme de ce genre avec des insertions en boucle.
    Le plus simple est de passer par un PreparedStatement (qui te permet d'éxécuter la meme requete SQL plusieurs fois de suite en ne modifiant que les paramètres, ici: "i")

    Et surtout de passer par un batch de requetes, qui te permet d'exécuter plusieurs requetes SQL en meme temps, sans faire de multiples connexions.
    Ainsi Tu remplaces ton Statement par un PreparedStatement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PreparedStatement stmt = null;
    stmt = con.prepareStatement("Insert into T1 (Nom_API,Valeur,Id) Values (?,?,?)");
    Ensuite dans ta boucle for tu rajoutes un batch, puis tu met les paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i = 0; i < 800; i++){
    	stmt.addBatch();
    stmt.setString(1, "Nord");
    stmt.setInt(2, 5);
    stmt.setInt(3, i);
    						}
    Et en sortant de ta boucle "for", tu exécutes le batch:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[] resultat = stmt.executeBatch();

    Et ça devrait marcher plus vite.
    Pour info je ne sais pas s'il y a une limite de requetes dans un batch, moi dans mon appli je les faisais 1000 par 1000.


    edit: le driver de base de mysql gère les batch, je ne sais pas si c'est le cas du tiens. De toute façon il vaut mieux faire ce que Tchize t'avait répondu (si ce n'est dejà fait) et abandonner odbc
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 61
    Points
    61
    Par défaut
    merci Beaucoup pour ta réponse

    je vient de trouver c'est quoi le probleme c'est plutot du coté MySQL on peut définir le Type d'acces a une table et par rapport à ce type ça peut prendre bcp plus de temps (je suppose qu'il fait plus de controle avant la mise a jours des données).
    et la une fois que j'ai changer le type d'accées a la table (le plus rapide) je passe de 13 sec a meme pas 30 milliseconde

    merci bcp pour vos réponse

  8. #8
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Ceci dit même si tu as réussi sans utiliser les PreparedSatement, tu devrais songer a les utiliser. Ca rend tes requetes plus portable et généralement plus efficaces.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/06/2008, 15h49
  2. Insérer dans une base donne mysql
    Par kh12040 dans le forum C
    Réponses: 3
    Dernier message: 12/06/2008, 19h55
  3. Probleme d'ecriture dans une base access
    Par mohamed_simo dans le forum ASP
    Réponses: 5
    Dernier message: 05/04/2006, 09h55
  4. Tirage aléatoire dans une base donnée
    Par leloup84 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 30/01/2006, 16h13
  5. [JDBC]lecture/ecriture dans une base de donnée
    Par tarik75 dans le forum JDBC
    Réponses: 7
    Dernier message: 30/06/2005, 12h42

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