2010-10-19 54 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