1. 程式人生 > >如何利用LoadRunner最高效的批量製造Oracle資料

如何利用LoadRunner最高效的批量製造Oracle資料

前不久寫過一篇高效大批量製造MySQL資料的文章:《如何利用LoadRunner最高效的批量製造MySQL資料》,後來有人問我,怎麼高效大批量製造Oracle資料。其實是一樣的,也是用JDBC的批量插入(addBatch)方法,以下就提供一下我寫的指令碼,以供參考:

/*
 * 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
}
然後通過Loadrunner進行多使用者併發的跑指令碼,快速的製造出成千上億條資料,我就是用這個方法,在測試環境中模擬出現場的大資料量,然後去重現或定位系統當中由於慢SQL引起的慢事務問題。
        注:以上這是批量插入資料的指令碼,有人會將批量更新也放到指令碼中執行,這時候就要避免行級鎖在高併發時引起死鎖,所以強調更新條件應該使用主鍵。