mybatis批量插入oracle大量數據記錄性能問題解決
來源:程序員人生 發布時間:2014-09-29 08:00:01 閱讀次數:2357次
環境: mybatis + oracle11g r2
1.使用"直接路徑插入"(下面sql語句中的"/*+append_values */"),并且使用關鍵字"union all":
<insert id="addUidCodeBatch" parameterType="java.util.List">
insert into /*+append_values */
T_UID_CODE(C_UID_CODE,
C_SERAIL_LEN,
C_BATCH_CODE,
C_TYPE,
C_CREATE_TIME,
C_SUPER_CODE,
c_security_code,
C_SERIAL_CODE
)
<foreach collection="list" item="item" index="index" separator="union all" >
select #{item.uidCode},
#{item.kCode},
#{item.batchCode},
#{item.type},
sysdate,
#{item.superCode},
#{item.securityCode},
#{item.serialCode}
from dual
</foreach>
</insert>
2.dao層實現: 之前是一次性commit,這樣做會隨著插入數目的增大,執行速度陡然變慢,所以應該分批次進行插入:
public void save(List<UidCodeBean> uidCodeList) throws Exception {
SqlSession batchSqlSession = null;
try {
batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);//獲取批量方式的sqlsession
int batchCount = 1000;//每批commit的個數
int batchLastIndex = batchCount - 1;//每批最后一個的下標
for(int index = 0; index < uidCodeList.size()-1;){
if(batchLastIndex > uidCodeList.size()-1){
batchLastIndex = uidCodeList.size() - 1;
batchSqlSession.insert(NAMESPACE+".addUidCodeBatch", uidCodeList.subList(index, batchLastIndex));
batchSqlSession.commit();
System.out.println("index:"+index+" batchLastIndex:"+batchLastIndex);
break;//數據插入完畢,退出循環
}else{
batchSqlSession.insert(NAMESPACE+".addUidCodeBatch", uidCodeList.subList(index, batchLastIndex)); batchSqlSession.commit();
System.out.println("index:"+index+" batchLastIndex:"+batchLastIndex);
index = batchLastIndex + 1;//設置下一批下標
batchLastIndex = index + (batchCount - 1);
}
}
}finally{
batchSqlSession.close();
}
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈