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