闲来无事,就想测试一下我的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
分享到:
相关推荐
jdbc数据软件测试中使用JDBC插入大量数据的性能测试使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:1、使用statement插入100000条记录...
代码部分包含了使用JDBC和Mybatis进行批量插入的示例,你可以直接运行这些代码进行测试。同时,数据库脚本和初始数据也在其中,确保了测试的一致性和可重复性。 通过这样的性能测试,我们可以了解到在特定场景下,...
使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:1、使用statement插入100000条记录 使用jdbc向数据库插入100000条记录,分别使用...
综上所述,Java使用JDBC进行批量插入数据是通过PreparedStatement的批处理功能实现的,通过设置手动提交和优化连接字符串,以及合理控制批量处理的大小和选择合适的数据库配置,可以有效地提高插入10万条或更多数据...
4. **执行SQL操作** - 包括查询、插入、更新和删除数据。 5. **处理结果集** - 如果是查询操作,会返回一个`ResultSet`对象,可以通过迭代器遍历并获取数据。 6. **关闭资源** - 记得在完成操作后关闭`ResultSet`...
`test_jdbc.java`可能包含一个名为`TestJdbc`的类,这个类通常会实现上述的JDBC连接步骤,并可能包含一些额外的功能,如插入、更新、删除数据,或者执行存储过程。测试类可能会包含以下方法: - `void ...
与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。 1、查找驱动...
本文将重点介绍如何在JMeter中使用JDBC Request来执行多条SQL语句,包括查询与更新操作,并针对不同类型的SQL语句提供最佳实践。 #### 二、JDBC Request概述 JDBC Request是JMeter提供的一个用于执行数据库操作的...
总结起来,JDBC数据访问对象学习资料将引导你理解如何在MVC架构中使用JDBC进行数据访问层的封装,包括DAO设计模式的应用,JDBC的基本操作流程,以及如何在实际项目中优化和提升数据访问的效率。通过学习,你将能够更...
- **逐条插入**: 使用`sigleAddSave`方法逐条插入数据。 根据测试结果分析,批量插入与逐条插入之间存在明显的性能差异: - 当批量插入1000条数据时,所需时间约为逐条插入的0.4倍。 - 插入2000条数据时,批量插入...
这个"测试JDBC源代码"的项目旨在通过实际的代码示例来讲解如何使用JDBC进行数据库操作,包括建立数据库连接、使用Statement接口执行SQL语句以及处理ResultSet结果集。同时,它还涉及到了SQL注入问题,这是数据库安全...
综上所述,通过JDBC连接程序实现数据库数据迁移是一个涉及多步骤的过程,包括连接数据库、编写查询、处理结果、批量插入、资源管理和错误处理。在实际操作中,应根据具体业务需求进行调整和优化,确保迁移的高效和...
2. 添加“JDBC Request”元件,指定SQL查询或操作,如读取数据、插入记录、更新或删除。 3. 可以添加“View Results Tree”监听器来查看请求的详细结果,包括执行时间、返回结果集等。 4. 设置线程组参数,如并发...
在实际测试过程中,为了确保数据的一致性和可重复性,通常会在测试前后执行DDL(Data Definition Language)语句,如CREATE TABLE、DROP TABLE等,这可以通过JDBC请求采样器实现。同时,还可以通过“前置处理器”和...
在千万级数据测试中,这些脚本可能用于模拟实际业务场景,例如,创建课程表,插入大量课程记录,然后进行各种查询操作,以此来验证ShardingJDBC的分片策略和性能。 在SQL方面,以下是一些关键知识点: 1. **索引...
首先,**JDBC创建触发器** 是一种数据库级别的事件响应机制,允许在特定数据库事件(如插入、更新或删除记录)发生时自动执行预定义的SQL代码。通过JDBC,我们可以编写Java程序来动态生成并执行创建触发器的SQL语句...
7. **在JSP页面上显示数据**:在JSP页面中,利用JSTL(JavaServer Pages Standard Tag Library)或EL(Expression Language)表达式,从请求作用域中取出数据,并将其插入到HTML元素中。例如,可以使用`<c:forEach>`...
在`JDBCBatchInsert.java`中,可以看到如何创建PreparedStatement对象,设置占位符,然后多次调用`addBatch()`添加不同的数据,最后调用`executeBatch()`执行批量插入。 2. **使用Statement的batchUpdate()** ...