2010-10-19 9 views
0

J'utilise ibatis pour mon stmt d'insertion sql. Dans mon code, j'analyse les fichiers ligne par ligne à partir d'un dossier. Chaque ligne correspondant aux critères doit être insérée dans la base de données. Le nombre total d'insertion dans une seule série de programme peut être n'importe où le long de 200k.ibatis: améliore les performances d'insertion

SqlSession sess = null;  
    this.sess = sf.openSession(ExecutorType.BATCH, false); 
    for (each file) { 
    for(each line matching criteria){ 
     this.sess.insert("com.logs.util.insertFileInfo", fileData); 
     insertcount++; 
     if(insert count == 10) 
       this.sess.commit(); 
     }  
     } 
     if(insert count > 0){ 
      this.sess.commit(); 
     } 
    } 

Ce style prend lentement beaucoup de mémoire et après quelques temps throws Exception OutOfMemory. Comment puis-je améliorer les performances ici?

Répondre

0

Avez-vous l'intention de vous engager après 10 insertions? Il semble que vous ne le fassiez qu'après les 10 premières insertions. Je suppose que vous auriez besoin de quelque chose comme

if ((insertCount % 10) == 0) { 
    this.sess.commit(); 
} 

Ces modifications non validées doivent être stockées quelque part. Je ne suis pas familier avec Ibatis mais si les changements non validés sont stockés dans un buffer alloué par Ibatis alors vous finirez par manquer de mémoire si vous ne validez pas les changements.

+0

vient de mettre à jour l'algo – changed

+0

Avec ce changement, vous commettrez après les 10 premières lignes et ensuite après chaque fichier si une validation est requise ou non; ça ne sonne pas vraiment bien. Si un fichier contient (disons) 50K lignes, alors ces 50K éléments devront être tamponnés quelque part. Ils seront conservés par Ibatis, le pilote JDBC sous-jacent ou le SGBD. Si vous utilisez l'opérateur mod (%), vous ne tamponnerez jamais plus de 10 modifications en attente. De plus, n'oubliez pas de valider la session une fois la boucle externe terminée. – PhilDin

Questions connexes