2010-10-19 126 views
0

我正在使用ibatis for my sql insert stmt。在我的代碼中,我從文件夾中逐行解析文件。每條符合條件的行都需要插入到數據庫中。 程序的一次運行中插入的總數可以是任何沿着200k的地方。ibatis:提高插入性能

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(); 
     } 
    } 

此風格緩慢佔用大量內存,並在某些時候拋出OutOfMemory異常。 如何提高性能?

回答

0

您打算在每插入10次後執行一次嗎?看起來你只有在前10次插入後才這樣做。我想你會需要類似

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

那些未提交的更改必須存儲在某處。我對Ibatis不熟悉,但如果未提交的更改存儲在由Ibatis分配的緩衝區中,那麼如果不提交更改,最終會導致內存不足。

+0

剛剛更新了算法 – changed 2010-10-19 16:26:42

+0

隨着這一改變,你會在前10行之後提交,然後在每個文件之後提交是否需要提交;它聽起來並不正確。如果一個文件包含(說)50K行,那麼這些50K項目將不得不被緩衝在某處。它們將由Ibatis,底層JDBC驅動程序或DBMS保留。如果您使用mod運算符(%),那麼您將永遠不會緩衝超過10個掛起的更改。另外,不要忘記在外部循環完成後提交會話。 – PhilDin 2010-10-19 16:43:51