JDBC: 批量處理提高SQL處理速度
當需要成批插入或者更新記錄時。可以采用Java的批量更新機制,這一機制允許多條語句一次性提交給數據庫批量處理。通常情況下比單獨提交處理更有效率
JDBC的批量處理語句包括下面兩個方法:
addBatch(String):添加需要批量處理的SQL語句或是參數;
executeBatch();執行批量處理語句;
通常我們會遇到兩種批量執行SQL語句的情況:
多條SQL語句的批量處理;
一個SQL語句的批量傳參;
測試代碼:
import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.Statement; import org.junit.Test; import xuezaipiao1.JDBC_Tools; /** * 向Oracle 的 temp 數據表中添加 10萬 條記錄 * 測試如何插入,用時最短 */ public class JDBCTest { /** * * 1.使用 Statement . * 測試用時:35535 */ @Test public void testBbatchStatement() { Connection conn = null; Statement statement = null; String sql = null; try { conn = JDBC_Tools.getConnection(); JDBC_Tools.beginTx(conn); long beginTime = System.currentTimeMillis(); statement = conn.createStatement(); for(int i = 0;i<100000;i++){ sql = "INSERT INTO temp values("+(i+1) +",'name_"+(i+1)+"','13-6月 -15')"; statement.executeUpdate(sql); } long endTime = System.currentTimeMillis(); System.out.println("Time : "+(endTime - beginTime)); JDBC_Tools.commit(conn); } catch (Exception e) { e.printStackTrace(); JDBC_Tools.rollback(conn); }finally{ JDBC_Tools.relaseSource(conn, statement); } } /** * 使用PreparedStatement * 測試用時:9717 */ @Test public void testBbatchPreparedStatement() { Connection conn = null; PreparedStatement ps = null; String sql = null; try { conn = JDBC_Tools.getConnection(); JDBC_Tools.beginTx(conn); long beginTime = System.currentTimeMillis(); sql = "INSERT INTO temp values(?,?,?)"; ps = conn.prepareStatement(sql); Date date = new Date(new java.util.Date().getTime()); for(int i = 0;i<100000;i++){ ps.setInt(1, i+1); ps.setString(2, "name_"+i); ps.setDate(3, date); ps.executeUpdate();//9717 } long endTime = System.currentTimeMillis(); System.out.println("Time : "+(endTime - beginTime)); JDBC_Tools.commit(conn); } catch (Exception e) { e.printStackTrace(); JDBC_Tools.rollback(conn); }finally{ JDBC_Tools.relaseSource(conn, ps); } } /** * 測試用時 : 658 */ @Test public void testBbatch() { Connection conn = null; PreparedStatement ps = null; String sql = null; try { conn = JDBC_Tools.getConnection(); JDBC_Tools.beginTx(conn); long beginTime = System.currentTimeMillis(); sql = "INSERT INTO temp values(?,?,?)"; ps = conn.prepareStatement(sql); Date date = new Date(new java.util.Date().getTime()); for(int i = 0;i<100000;i++){ ps.setInt(1, i+1); ps.setString(2, "name_"+i); ps.setDate(3, date); //積攢SQL ps.addBatch(); //當積攢到一定程度,就執行一次,并且清空記錄 if((i+1) % 300==0){ ps.executeBatch(); ps.clearBatch(); } } //總條數不是批量值整數倍,則還需要在執行一次 if(100000 % 300 != 0){ ps.executeBatch(); ps.clearBatch(); } long endTime = System.currentTimeMillis(); System.out.println("Time : "+(endTime - beginTime)); JDBC_Tools.commit(conn); } catch (Exception e) { e.printStackTrace(); JDBC_Tools.rollback(conn); }finally{ JDBC_Tools.relaseSource(conn, ps); } } }
本文由用戶 c6g3 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!