`
FeiXing2008
  • 浏览: 53266 次
  • 性别: 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条记录...

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

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

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

    Mybatis与JDBC批量插入MySQL数据库性能测试,资源包含文档、代码和数据库。

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

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?今天小编通过本教程给大家介绍下

    jdbc连接数据库的方式2

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

    java jdbc 线程插入记录

    JDBC 用线程写入mysql数据库记录10万条,测试本机127.0.0.1写入速度约 482条/秒,测试代码端显示约需要124秒,SQL分析数据结果是480条左右,除去前后两秒无效数据,统计SQL如下 select max(num),min(num),avg(num) ...

    junit测试JDBC错误源代码

    junit测试JDBC错误源代码,使用该源代码运行理论上插入数据库会插入两条数据,不知道是哪里出问题

    测试数据生成工具

    (JavaMetal,SystemDefault) 附带一个查询控制台,可以处理常规SQL查询操作 生成的测试数据,可以直接插入到数据表中,也可以以Insert语句形式记录在文件中 如果没有积分,可到下面的网址下载. 更新版本...

    100万级数据插入测试

    100万级数据插入 总结目前网上的spring batchUpdate方法,和jdbc PreparedStatement的addBatch,及insert的2种插入方式引起的效率差别,我的博客中有说明!

    Java_JDBC由浅入深

    第六节 JDBC 中数据类型详解 30 6.1 基本数据类型 30 6.2 日期类型 34 6.3 CLOB类型 36 6.4 BLOB类型 39 6.5 其他数据类型 41 第七节 DAO设计模式详解 41 7.1 实际项目中如何使用JDBC 41 7.2 DAO设计模式简介 42 7.3...

    jsp+servlet+jdbc实现简单的购物车实例.zip

    亲自测试可用,放心下载! 项目描述 jsp+servlet+jdbc实现简单的购物车实例,购物数据通过session存储 1、加入购物车时,把数据保存在session中 2、点击系统退出时,购物车中的数据插入到数据库购物车表 3、再次登录...

    JDBC:用于测试和实践Java JDBC API的多个程序

    用于测试和实践Java JDBC API的多个程序 RecordTester.java RecordTester是一个简单的初学者程序,用于熟悉Java的JDBC API。 从控制台接收参数以连接到数据库,然后创建表并将值插入表中。 行数和列数通过控制台...

    JDBC-API-WEB.rar_JDBC api_JDBC web_jdeveloper_oracle jdbc A_web

    用Oracle JDeveloper 10g IDE基于JDBC API的Web开发的简单测试.[InsertData]文件夹完成数据插入功能;[queryMetaData]纪录集元数据;[updateTable]完成可被更新和滚动的纪录集;[bindQuery]实现PreparedStatement...

    ClickHouse-Native-JDBC:ClickHouse本机协议JDBC实现

    注意:我们仅使用Java LTS版本进行测试。 与区别 数据按列进行组织和压缩。 以下是,它以TCP协议实现,性能比HTTP高。 局限性 不支持插入复杂值表达式,例如INSERT INTO test_table VALUES(toDate(123456))

    JDBC.rar_Table

    请在数据库中创建表格记录上面的类,并用界面显示数据库中的数据,用户可以通过界面插入,删除和修改数据,可以修改多个数据再进行提交,这时候要求一个更改没有成功更新,所有更新都要回滚。 要求: 1. 安装MySql,...

    JSP中使用JDBC访问SQL Server 2008数据库示例

    (1)下载对应数据库版本的jdbc驱动并安装,注意安装后的得到的三个文件msbase.jar,mssqlserver.jar,msutil.jar,将其拷贝到jsp项目的WEB-INF/lib下面,也拷贝到Tomcat安装目录的lib下面,没有具体测试,应该和...

    Java数据库编程宝典2

    6.1 使用SQL INSERT插入数据 6.1.1 INSERT语句 6.1.2 使用带有JDBC的INSERT 6.1.3 使用INSERT SELECT 6.2 UPDATE语句 6.2.1 在UPDATE中使用经计算的值 6.2.2 UPDATE的常见问题 6.3 带有提交和回滚的事务管理...

    Java数据库编程宝典4

    6.1 使用SQL INSERT插入数据 6.1.1 INSERT语句 6.1.2 使用带有JDBC的INSERT 6.1.3 使用INSERT SELECT 6.2 UPDATE语句 6.2.1 在UPDATE中使用经计算的值 6.2.2 UPDATE的常见问题 6.3 带有提交和回滚的事务管理...

    Java数据库编程宝典1

    6.1 使用SQL INSERT插入数据 6.1.1 INSERT语句 6.1.2 使用带有JDBC的INSERT 6.1.3 使用INSERT SELECT 6.2 UPDATE语句 6.2.1 在UPDATE中使用经计算的值 6.2.2 UPDATE的常见问题 6.3 带有提交和回滚的事务管理...

    Java数据库编程宝典3

    6.1 使用SQL INSERT插入数据 6.1.1 INSERT语句 6.1.2 使用带有JDBC的INSERT 6.1.3 使用INSERT SELECT 6.2 UPDATE语句 6.2.1 在UPDATE中使用经计算的值 6.2.2 UPDATE的常见问题 6.3 带有提交和回滚的事务管理...

Global site tag (gtag.js) - Google Analytics