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

Hibernate Java Discussion :

[Hibernate 3 / MySql 5] Injecter dans MySQL un fichier volumineux


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 161
    Points : 90
    Points
    90
    Par défaut [Hibernate 3 / MySql 5] Injecter dans MySQL un fichier volumineux
    Bonjour,

    Je souhaiterais conseils et point de vue concernant le chargement d'un fichier dont la taille avoisine 18 gigaoctets, contenant quasiment 41 millions d'articles, lesquels répondent à une structure de champs de longueur fixe.

    Mon schéma s'enrichit d'une nouvelle table que je dois remplir à partir de ce fichier. Aucun problème pour créer et insérer la nouvelle table dans le projet, puis pour faire le mapping.

    Le chargement initial par la méthode brutale - script SQL - dure près de 26 heures, Hibernate permet de le faire en moins de 4 heures.

    Voici la méthode Java que j'ai faite permettant ce chargement :

    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
     
    	public static void chargerFIP(String nomFicIn) {
    		long cpt = 0;
    		Date d1 = new Date();
    		Log.info(sdf.format(d1) + "; debut chargerFip");
    		Log.info(sdf.format(d1) +  "; " + nomFicIn);
    		try {
    			InputStream ips = new FileInputStream(nomFicIn);
    	        	InputStreamReader ipsr = new InputStreamReader(ips);
    	        	BufferedReader br = new BufferedReader(ipsr);
    	        	String l;
    	        	cpt = 1;
    	        	while ((l = br.readLine()) != null) {
    				ArticleId mId = new ArticleId ();
    				mId.toArticle(l);
    				Article m = new Article(mId);
    				session.save(m);
    				cpt ++;
    				if (cpt % 50000 == 0) {
    					session.flush();
    					session.clear();
    					Log.info(sdf.format(new Date()) + "; " + cpt + " éléments enregistrés");
    				}
    	       		}
    	        	tx.commit();
    	        	br.close();
    	        	ipsr.close();
    	       		ips.close();
    	    	} catch (Exception e) {
    	    		Log.error(sdf.format(new Date()) + "; élément " + cpt + " : " + e.toString());
    		}
    		Date d2 = new Date();
    		Log.info(sdf.format(d2) + "; fin chargerFip");
    	}
    L'idée est d'utiliser les méthodes flush et clear, cependant il y a une faille : le commit ne se fait qu'à la fin. Si jamais, pour une raison ou pour une autre, le chargement plante, la table n'est pas pour autant remplie et tout est perdu. Cela m'est arrivé ce matin... Près de 3 heures perdues pour rien. Mettre le commit dans le traitement de l'exception n'est pas forcément la bonne solution, j'y ai bien pensé.

    Alors je me suis penché sur la question : je fais des commit tous les 50000 articles, mais je dois réouvrir une session après chaque commit, avec des effets un peu bizarres, telle la base figée. J'ai cherché sur Internet de l'aide, mais je ne suis pas très bon en anglais... Ainsi je ne vois pas d'alternative à cela.

    Ainsi, si quelqu'un pouvait me conseiller sur la façon de faire, je l'en remercie d'avance.

    DomIII

  2. #2
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    regardes ce lien

    eric

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 161
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Merci pour ce lien, je vais donc étudier cela. Je remarque que j'applique déjà la partie II.C.

    Je reviendrai plus tard en parler.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 161
    Points : 90
    Points
    90
    Par défaut
    Re-bonjour,

    J'aurais besoin d'avis et de commentaires sur ce petit bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (cpt % 25000 == 0) {
      session.flush();
      session.clear();
      tx.commit();
      tx = session.beginTransaction();
      Log.info(sdf.format(new Date()) + "; " + cpt + " éléments enregistrés");
    }
    En outre je fais un commit et rouvre aussitôt une transaction : est-ce bien ou mal de faire cela ? Y a-t-il des risques, failles, etc... ?

    Merci par avance de vos réponses.

Discussions similaires

  1. JPA Hibernate Index non crée dans Mysql
    Par fvisticot dans le forum JPA
    Réponses: 5
    Dernier message: 24/10/2010, 05h35
  2. Réponses: 3
    Dernier message: 22/09/2009, 11h43
  3. Réponses: 3
    Dernier message: 04/05/2009, 09h28
  4. Réponses: 1
    Dernier message: 10/01/2008, 14h52

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