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 :

Comment éviter des milliers d'Insert


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 187
    Points : 65
    Points
    65
    Par défaut Comment éviter des milliers d'Insert
    Bonjour


    Pour un projet j'ai construit une liste d'objets java qui contient elle même une liste enfants d'objets formant un arbre père/fils.

    Au total j'ai plusieurs dizaines de milliers d'objets oren sauvegardant j'ai remarqué que pour chaque objet j'avais un insert dans la base de données du coup cette opération peut me prendre presque une heure.

    N'y aurait-il pas un moyen de faire les insert par blocs :

    en gros passer de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO ... VALUES (...)
    INSERT INTO ... VALUES (...)
    INSERT INTO ... VALUES (...)
    INSERT INTO ... VALUES (...)
    à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ... VALUES (...),(...),(...),(...)

    Et ainsi n'avoir qu'une seule requête

  2. #2
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut
    Salut

    C est peut long parce qu il fait un commit apres chaque insert ; Ce qui va prendre du temps c est le commit et non pas la requete insert.
    Il faudrais essaye de faire un commit tout 100 enregitrements.

    ++

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    sur sql server il est possible d'utiliser la syntaxe que tu souhaiterais, à voir selon ton sgbdr

    sinon une autre possibilité plus rapide est de faire tes insert dans une table temporaire (sans journalisation style table @ pour sql server)
    puis de faire insert into table finale (...) select 1... from @tabletmp
    l'insert sera donc fait en une seule fois et quasi instantanément
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    sinon une autre possibilité plus rapide est de faire tes insert dans une table temporaire (sans journalisation style table @ pour sql server)
    puis de faire insert into table finale (...) select 1... from @tabletmp
    l'insert sera donc fait en une seule fois et quasi instantanément
    Euh, non. Le problème sera le même. Les variables tables et les tables temporaires sont aussi persistées sur le disque, dans la base de données tempdb. Eventuellement, s'il y a des mises à jour d'index ceux-ci seront effectivement plus rapide si l'insertion se fait en une fois, mais le goulot d'étranglement dans le cas d'insert multiple comme ici, ce sont les échanges entre l'applicatif et le SGBD.

    Le problème est plutôt un soucis de configuration de NHibernate que de base de données. Si un spécialiste NHibernate passe par là...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    l'écriture disque n'est pas la journalisation, et elle est peu importante
    la mise à jour des indexes, les éventuels triggers ... ceci a un impact réel entre 1k insert et un insert d'1k ligne
    même si on transmet les 1k insert dans une seule commande (avec donc un seul allez retour)

    après les ORM posent en effet ce genre de problème ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    J'ai deplace la discussion dans le forum Java > Persistence > Hibernate. NHibernate est le portage en .NET d'Hibernate (pour Java).

    Je ne suis pas specialist de Java, mais apparemment il est possible d'activer le mode batch : How to batch INSERT and UPDATE statements with*Hibernate.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. Réponses: 13
    Dernier message: 08/06/2009, 09h26
  2. Comment éviter des requêtes dans une boucle
    Par dam28800 dans le forum Langage
    Réponses: 43
    Dernier message: 04/12/2008, 16h53
  3. [MySQL] Comment éviter des doublons dans une liste déroulante ?!
    Par L'anonyme_connu dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/03/2008, 11h14
  4. Comment faire des inserts massivement et rapidement ?
    Par JYves dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/08/2006, 10h57

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