浏览 2891 次
锁定老帖子 主题:使用JDBC插入多数据测试
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-15
最后修改:2010-01-15
现在不清楚我的测试方法到位否,所以与大家分享一下,看看大家的意见。 测试的思路: 多次向表中插入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> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-16
看来没有人对这个有兴趣喔。
|
|
返回顶楼 | |