如何利用LoadRunner最高效的批量製造Oracle資料
阿新 • • 發佈:2019-01-27
前不久寫過一篇高效大批量製造MySQL資料的文章:《如何利用LoadRunner最高效的批量製造MySQL資料》,後來有人問我,怎麼高效大批量製造Oracle資料。其實是一樣的,也是用JDBC的批量插入(addBatch)方法,以下就提供一下我寫的指令碼,以供參考:
然後通過Loadrunner進行多使用者併發的跑指令碼,快速的製造出成千上億條資料,我就是用這個方法,在測試環境中模擬出現場的大資料量,然後去重現或定位系統當中由於慢SQL引起的慢事務問題。/* * LoadRunner Java script. (Build: _build_number_) * * Script Description: * */ import lrapi.lr; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.lang.StringBuffer; import java.util.List; import java.util.ArrayList; public class Actions { //設定資料庫驅動,資料庫連線地址、埠、名稱,使用者名稱,密碼 String driverName="oracle.jdbc.OracleDriver"; String url="jdbc:oracle:thin:@192.168.1.176:1521:orcl"; String user="test"; //使用者名稱 String password="123456"; //密碼 PreparedStatement pstmt = null; //資料庫連線物件 Connection conn = null; public void connection(){ try { //反射Oracle資料庫驅動程式類 Class.forName(driverName); //獲取資料庫連線 conn = DriverManager.getConnection(url, user, password); // 關閉事務自動提交 conn.setAutoCommit(false); //輸出資料庫連線 System.out.println(conn); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public void deconnection(){ try{ if(pstmt != null){ pstmt.close(); } if(conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } public void addBatchData(List alist){ try{ for (int i = 0; i < alist.size(); i++) { pstmt.setString((i+1), alist.get(i).toString()); } //把一個SQL命令加入命令列表 pstmt.addBatch(); } catch (Exception e) { e.printStackTrace(); } } public int init() throws Throwable { return 0; }//end of init public int action() throws Throwable { String sqlStr="insert into test_opadetail(id, opaid, pripid, uniscid, entname, enttype, enttype_cn, regorg, " + "regorg_cn, lerep, regno, certype, cerno, specause, specause_cn, abntime, decorg, decorg_cn, ismove, " + "remexcpres, remexcpres_cn, remdate, redecorg, redecorg_cn, creationtime, creatoruserid, lastmodificationtime, " + "lastmodifieruserid, deletiontime, deleteruserid, isdeleted, dom, enttype_zn, year)" + " values " + "(sys_guid(), ?, ?, ?, ?, ?, ?, '220101', '長春市工商行政管理局', 'test', ?, '', '', 1, " + "'未按規定公示年報', to_date(to_char(sysdate,'yyyy/mm/dd'),'YYYY/MM/DD'), '220101', '長春市工商行政管理局', 1," + " '', '', '', '', '', to_date(to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),'YYYY/MM/DD HH24:MI:SS'), " + "'97e6daadd18f4667be0c5c42b84b8a90', to_date(to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),'YYYY/MM/DD HH24:MI:SS'), " + "'97e6daadd18f4667be0c5c42b84b8a90', '', '', 0, ?, ?, '')"; List list = new ArrayList();//定義一組引數化資料 list.add(lr.eval_string("{Param1}")); list.add(lr.eval_string("{Param2}")); list.add(lr.eval_string("{Param3}")); list.add("TEST"+lr.eval_string("{Param4}")); list.add(lr.eval_string("{Param5}")); list.add(lr.eval_string("{Param6}")); list.add(lr.eval_string("{Param7}")); list.add(lr.eval_string("TESTA-{Param4}")); list.add(lr.eval_string("{Param12}")); connection(); StringBuffer sql = new StringBuffer(); sql.append(sqlStr); lr.start_transaction("action"); try{ //建立該連線下的PreparedStatement物件 pstmt = conn.prepareStatement(sql.toString()); for (int k=0;k<1000;k++){//一個User一批次插入1000條 addBatchData(list); } // 執行批量更新 pstmt.executeBatch(); } catch (Exception e) { e.printStackTrace(); } lr.end_transaction("action", lr.AUTO); deconnection(); return 0; }//end of action public int end() throws Throwable { return 0; }//end of end }
注:以上這是批量插入資料的指令碼,有人會將批量更新也放到指令碼中執行,這時候就要避免行級鎖在高併發時引起死鎖,所以強調更新條件應該使用主鍵。