如何利用LoadRunner最高效的批量制造Oracle数据

简介: 前不久写过一篇高效大批量制造MySQL数据的文章:《如何利用LoadRunner最高效的批量制造MySQL数据》,后来有人问我,怎么高效大批量制造Oracle数据。其实是一样的,也是用JDBC的批量插入(addBatch)方法,以下就提供一下我写的脚本,以供参考
版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问我的博客 https://blog.csdn.net/smooth00/article/details/77965361

前不久写过一篇高效大批量制造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引起的慢事务问题。
        注:以上这是批量插入数据的脚本,有人会将批量更新也放到脚本中执行,这时候就要避免行级锁在高并发时引起死锁,所以强调更新条件应该使用主键。
目录
相关文章
|
6天前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
【赵渝强老师】Oracle的还原数据
|
3月前
|
SQL 运维 Oracle
【迁移秘籍揭晓】ADB如何助你一臂之力,轻松玩转Oracle至ADB的数据大转移?
【8月更文挑战第27天】ADB(Autonomous Database)是由甲骨文公司推出的自动化的数据库服务,它极大简化了数据库的运维工作。在从传统Oracle数据库升级至ADB的过程中,数据迁移至关重要。
64 0
|
3月前
|
数据采集 Oracle 关系型数据库
实时计算 Flink版产品使用问题之怎么实现从Oracle数据库读取多个表并将数据写入到Iceberg表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
5天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的数据文件
在Oracle数据库中,数据库由多个表空间组成,每个表空间包含多个数据文件。数据文件存储实际的数据库数据。查询时,如果内存中没有所需数据,Oracle会从数据文件中读取并加载到内存。可通过SQL语句查看和管理数据文件。附有视频讲解及示例。
|
1月前
|
Oracle 关系型数据库 数据库
oracle数据创建同义词
oracle数据创建同义词
47 0
|
3月前
|
SQL 监控 Oracle
Oracle数据误删不用怕,跟我来学日志挖掘
Oracle数据误删不用怕,跟我来学日志挖掘
45 0
|
3月前
|
SQL Oracle 关系型数据库
Oracle误删数据怎么恢复?
Oracle误删数据怎么恢复?
45 0
|
3月前
|
SQL Oracle Java
实时计算 Flink版产品使用问题之采集Oracle数据时,为什么无法采集到其他TABLESPACE的表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
分布式计算 Oracle 关系型数据库
实时计算 Flink版产品使用问题之获取Oracle的数据时无法获取clob类型的数据,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

推荐镜像

更多