论坛首页 入门技术论坛

使用JDBC插入多数据测试

浏览 2869 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-01-15   最后修改:2010-01-15
闲来无事,就想测试一下我的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
   发表时间:2010-01-16  
看来没有人对这个有兴趣喔。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics