數(shù)據(jù)庫(kù)插入大量數(shù)據(jù)性能測(cè)試——批處理+事務(wù)VS普通插入
測(cè)試:sql server插入10000行數(shù)據(jù)
關(guān)鍵代碼(批處理+事務(wù)):
public?void?insertUser()?{
String?sql?=?"insert?into?users?values(?,?)";
Connection?conn?=?getConnection();
PreparedStatement?ps?=?null;
try?{
//?禁止自動(dòng)提交事務(wù)
conn.setAutoCommit(false);
//?創(chuàng)建能返回自動(dòng)生成的主鍵的值的預(yù)編譯對(duì)象
ps?=?conn.prepareStatement(sql);
//開(kāi)始時(shí)間的毫秒數(shù)
Long?start=System.currentTimeMillis();
for?(int?i?=?0;?i?<?10000;?i++)?{
ps.setString(1,?i+"");
ps.setInt(2,?22);
ps.addBatch();//?添加到批處理命令中
}
ps.executeBatch();//?執(zhí)行批處理
conn.commit();//?提交事務(wù)
//結(jié)束時(shí)間的毫秒數(shù)
Long?stop=System.currentTimeMillis();
//得到總耗時(shí)
Long?ms=stop-start;?
System.out.println("插入一萬(wàn)記錄耗時(shí):"+ms+"毫秒");
}?catch?(SQLException?e)?{
e.printStackTrace();
//取消事務(wù)
try{
conn.rollback();
}catch(SQLException?ee){
ee.printStackTrace();
}
}?finally?{
//打開(kāi)自動(dòng)提交事務(wù)
try?{
conn.setAutoCommit(true);
}?catch?(SQLException?e)?{
e.printStackTrace();
}
close(null,?ps,?conn);
}
}結(jié)果:
關(guān)鍵代碼(普通插入):
public?void?insertUser()?{
String?sql?=?"insert?into?users?values(?,?)";
Connection?conn?=?getConnection();
PreparedStatement?ps?=?null;
try?{
//?創(chuàng)建能返回自動(dòng)生成的主鍵的值的預(yù)編譯對(duì)象
ps?=?conn.prepareStatement(sql);
//開(kāi)始時(shí)間的毫秒數(shù)
Long?start=System.currentTimeMillis();
for?(int?i?=?0;?i?<?10000;?i++)?{
ps.setString(1,?i+"");
ps.setInt(2,?22);
ps.executeUpdate();
}
//結(jié)束時(shí)間的毫秒數(shù)
Long?stop=System.currentTimeMillis();
//得到總耗時(shí)
Long?ms=stop-start;?
System.out.println("插入一萬(wàn)記錄耗時(shí):"+ms+"毫秒");
}?catch?(SQLException?e)?{
e.printStackTrace();
}?finally?{
close(null,?ps,?conn);
}
}結(jié)果:
最后:差距還是挺大的!現(xiàn)在見(jiàn)識(shí)批處理和事務(wù)的高效了吧!





