`
FeiXing2008
  • 浏览: 53796 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用JDBC插入多数据测试

阅读更多
闲来无事,就想测试一下我的mysql插入数据的效率到底如何。
现在不清楚我的测试方法到位否,所以与大家分享一下,看看大家的意见。

测试的思路:
多次向表中插入1000条数据,看看每次使用了多少毫秒。现在我打算使用JDBC的方式去插入。

外话:
思路很简单,不过我这里使用了Spring JUnit,因为我上瘾了,非常地方便。想看看大家
是不是也这样子使用。所以我在后文中附贴出我一些关于JUnit Spring的配置代码,
想更多人来抛砖。

开始先看看表结构,非常简单的一个表,id是自动增长,ct里就是我会随加入内容的字段:


测试代码1:
import mumu.junit.Base.BaseTest;

public class MangInsertTest extends BaseTest {
	private static Logger log = Logger.getLogger(MangInsertTest.class);
	private static final int INSERT_COUNT = 5000;
	private static final int TEST_COUNT = 10;
	
	@Autowired
	private UnitTestDAO unitDao;
	
	@Test
	public void test() throws Exception{
		Connection conn = null;
		try{
			conn = unitDao.getConnection();
			conn.setAutoCommit(false);//将事务改成手工提交
			
			String inSql = "insert into mang(ct)value(?)";
			
			for(int i = 0; i < TEST_COUNT; ++i){
				long s = System.currentTimeMillis();
				long d = 0;
				PreparedStatement inPs = conn.prepareStatement(inSql);
				for(int k = 0; k < INSERT_COUNT; ++k){
					inPs.setString(1, "prefix string " + System.currentTimeMillis());
					inPs.addBatch();//放入批处理
				}
				inPs.executeBatch();
				conn.commit();//记得要提交喔
				inPs.close();
				d = System.currentTimeMillis() - s;
				log.info("used time:" + d);
			}			
			
			conn.setAutoCommit(true);//将conn改成自动提交
			
		}catch(Exception excep){
			throw excep;
		}finally{
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					throw e;
				}
			}
		}
		
	}
}

第一个我给出了所有代码,这里使用的jdbc批处理还有手工提交事务。
测试结果为:
INFO (MangInsertTest.java:42) - used time:822
 INFO (MangInsertTest.java:42) - used time:522
 INFO (MangInsertTest.java:42) - used time:540
 INFO (MangInsertTest.java:42) - used time:531
 INFO (MangInsertTest.java:42) - used time:500
 INFO (MangInsertTest.java:42) - used time:541
 INFO (MangInsertTest.java:42) - used time:500
 INFO (MangInsertTest.java:42) - used time:521
 INFO (MangInsertTest.java:42) - used time:490
 INFO (MangInsertTest.java:42) - used time:721


测试代码2:
conn = unitDao.getConnection();
			conn.setAutoCommit(false);//依然使用手动提交
			
			String inSql = "insert into mang(ct)value(?)";
			
			for(int i = 0; i < TEST_COUNT; ++i){
				long s = System.currentTimeMillis();
				long d = 0;
				PreparedStatement inPs = conn.prepareStatement(inSql);
				for(int k = 0; k < INSERT_COUNT; ++k){
					inPs.setString(1, "prefix string " + System.currentTimeMillis());
					inPs.executeUpdate();
				}
				conn.commit();
				inPs.close();
				d = System.currentTimeMillis() - s;
				log.info("used time:" + d);


只给出与测试不同的地方,其他地方基本相同。
这里只是将batch方式换成直接executeUpdate.
输出结果如下:
 INFO (MangInsertTest2.java:41) - used time:692
 INFO (MangInsertTest2.java:41) - used time:590
 INFO (MangInsertTest2.java:41) - used time:531
 INFO (MangInsertTest2.java:41) - used time:560
 INFO (MangInsertTest2.java:41) - used time:681
 INFO (MangInsertTest2.java:41) - used time:500
 INFO (MangInsertTest2.java:41) - used time:511
 INFO (MangInsertTest2.java:41) - used time:510
 INFO (MangInsertTest2.java:41) - used time:683
 INFO (MangInsertTest2.java:41) - used time:510



测试代码一与代码二的用时基本相同。
现在试试使用自动提交任务的方式去处理,以下是
测试代码3:
conn = unitDao.getConnection();
			
			conn.setAutoCommit(true);//保证是自动提交
			
			String inSql = "insert into mang(ct)value(?)";
			
			for(int i = 0; i < TEST_COUNT; ++i){
				long s = System.currentTimeMillis();
				long d = 0;
				PreparedStatement inPs = conn.prepareStatement(inSql);
				for(int k = 0; k < INSERT_COUNT; ++k){
					inPs.setString(1, "prefix string " + System.currentTimeMillis());
					inPs.addBatch();
				}
				inPs.executeBatch();
				//conn.commit();已经不需要自动提交
				inPs.close();
				d = System.currentTimeMillis() - s;
				log.info("used time:" + d);
			}


输出结果如下:
INFO (MangInsertTest3.java:42) - used time:150810
 INFO (MangInsertTest3.java:42) - used time:152054
 INFO (MangInsertTest3.java:42) - used time:133680
 INFO (MangInsertTest3.java:42) - used time:160455
 INFO (MangInsertTest3.java:42) - used time:163209
 INFO (MangInsertTest3.java:42) - used time:146589
 INFO (MangInsertTest3.java:42) - used time:112843


与测试代码1,2相比之下,需要很长的时间。
结论:
使用手动提交事务时,用不用batch区别不大。
手工提交与自动提交代码是有很大的区别。
虽然结论很简单,但是可以算是比较清楚确认。如果你质疑这种方法,可以提出更好的方法,
最好是上上代码。

现在贴出其他相关代码发:
package mumu.compass.unittest;

import java.sql.Connection;
import java.sql.SQLException;

import org.springframework.jdbc.core.JdbcTemplate;

public class UnitTestDAO {
	private JdbcTemplate jdbcTemplate;
	
	public Connection getConnection() throws SQLException{
		return jdbcTemplate.getDataSource().getConnection();
	}
	
	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
}

package mumu.junit.Base;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
	DependencyInjectionTestExecutionListener.class})
@Transactional
@ContextConfiguration(locations={"classpath*:/testContext.xml"}) 
public class BaseTest{
	

}


testContext.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	 xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:component-scan base-package="mumu.compass.unittest" />

	
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"        
        destroy-method="close">        
	    <property name="driverClassName" value="com.mysql.jdbc.Driver" />       
	    <property name="url" value="jdbc:mysql://localhost:3306/mutest" />       
	    <property name="username" value="root" />       
	    <property name="password" value="mysql" />       
	</bean> 
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
 		<property name="dataSource" ref="dataSource"/>  
	</bean>  
	
	<bean id="unitTestDao" class="mumu.compass.unittest.UnitTestDAO">  
 		<property name="jdbcTemplate" ref="jdbcTemplate"/> 
	</bean>
	
</beans>

  • 大小: 28.3 KB
分享到:
评论
1 楼 FeiXing2008 2010-01-16  
看来没有人对这个有兴趣喔。

相关推荐

    软件测试中使用JDBC插入大量数据的性能测试

    jdbc数据软件测试中使用JDBC插入大量数据的性能测试使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:1、使用statement插入100000条记录...

    Mybatis与JDBC批量插入MySQL数据库性能测试

    代码部分包含了使用JDBC和Mybatis进行批量插入的示例,你可以直接运行这些代码进行测试。同时,数据库脚本和初始数据也在其中,确保了测试的一致性和可重复性。 通过这样的性能测试,我们可以了解到在特定场景下,...

    使用JDBC插入大量数据的性能测试

    使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:1、使用statement插入100000条记录  使用jdbc向数据库插入100000条记录,分别使用...

    Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    综上所述,Java使用JDBC进行批量插入数据是通过PreparedStatement的批处理功能实现的,通过设置手动提交和优化连接字符串,以及合理控制批量处理的大小和选择合适的数据库配置,可以有效地提高插入10万条或更多数据...

    JDBC驱动和测试代码

    4. **执行SQL操作** - 包括查询、插入、更新和删除数据。 5. **处理结果集** - 如果是查询操作,会返回一个`ResultSet`对象,可以通过迭代器遍历并获取数据。 6. **关闭资源** - 记得在完成操作后关闭`ResultSet`...

    sqljdbc和测试jdbc连接类

    `test_jdbc.java`可能包含一个名为`TestJdbc`的类,这个类通常会实现上述的JDBC连接步骤,并可能包含一些额外的功能,如插入、更新、删除数据,或者执行存储过程。测试类可能会包含以下方法: - `void ...

    jdbc连接数据库的方式2

    与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。 1、查找驱动...

    Jmeter中JDBC request多条SQL语句使用.docx

    本文将重点介绍如何在JMeter中使用JDBC Request来执行多条SQL语句,包括查询与更新操作,并针对不同类型的SQL语句提供最佳实践。 #### 二、JDBC Request概述 JDBC Request是JMeter提供的一个用于执行数据库操作的...

    JDBC数据访问对象学习资料

    总结起来,JDBC数据访问对象学习资料将引导你理解如何在MVC架构中使用JDBC进行数据访问层的封装,包括DAO设计模式的应用,JDBC的基本操作流程,以及如何在实际项目中优化和提升数据访问的效率。通过学习,你将能够更...

    jdbc批量操作数据分析与实例

    - **逐条插入**: 使用`sigleAddSave`方法逐条插入数据。 根据测试结果分析,批量插入与逐条插入之间存在明显的性能差异: - 当批量插入1000条数据时,所需时间约为逐条插入的0.4倍。 - 插入2000条数据时,批量插入...

    测试JDBC源代码

    这个"测试JDBC源代码"的项目旨在通过实际的代码示例来讲解如何使用JDBC进行数据库操作,包括建立数据库连接、使用Statement接口执行SQL语句以及处理ResultSet结果集。同时,它还涉及到了SQL注入问题,这是数据库安全...

    jdbc连接程序实现不同数据库数据的迁移

    综上所述,通过JDBC连接程序实现数据库数据迁移是一个涉及多步骤的过程,包括连接数据库、编写查询、处理结果、批量插入、资源管理和错误处理。在实际操作中,应根据具体业务需求进行调整和优化,确保迁移的高效和...

    Jmeter需要的JDBC测试jar包

    2. 添加“JDBC Request”元件,指定SQL查询或操作,如读取数据、插入记录、更新或删除。 3. 可以添加“View Results Tree”监听器来查看请求的详细结果,包括执行时间、返回结果集等。 4. 设置线程组参数,如并发...

    jmeter的JDBC测试

    在实际测试过程中,为了确保数据的一致性和可重复性,通常会在测试前后执行DDL(Data Definition Language)语句,如CREATE TABLE、DROP TABLE等,这可以通过JDBC请求采样器实现。同时,还可以通过“前置处理器”和...

    mysql千万级数据脚本测试shardingjdbc-course.zip

    在千万级数据测试中,这些脚本可能用于模拟实际业务场景,例如,创建课程表,插入大量课程记录,然后进行各种查询操作,以此来验证ShardingJDBC的分片策略和性能。 在SQL方面,以下是一些关键知识点: 1. **索引...

    JDBC创建触发器 JDBC存储过程 JDBC创建表 数据备份 java备份数据库/JAVA恢复数据、java导入sql脚本

    首先,**JDBC创建触发器** 是一种数据库级别的事件响应机制,允许在特定数据库事件(如插入、更新或删除记录)发生时自动执行预定义的SQL代码。通过JDBC,我们可以编写Java程序来动态生成并执行创建触发器的SQL语句...

    使用servlet,jdbc将mysql中数据显示在jsp页面中

    7. **在JSP页面上显示数据**:在JSP页面中,利用JSTL(JavaServer Pages Standard Tag Library)或EL(Expression Language)表达式,从请求作用域中取出数据,并将其插入到HTML元素中。例如,可以使用`&lt;c:forEach&gt;`...

    三种JDBC批量插入编程方法的比较

    在`JDBCBatchInsert.java`中,可以看到如何创建PreparedStatement对象,设置占位符,然后多次调用`addBatch()`添加不同的数据,最后调用`executeBatch()`执行批量插入。 2. **使用Statement的batchUpdate()** ...

Global site tag (gtag.js) - Google Analytics