`

MyBatis批量大数据测试的一些结果

 
阅读更多

MyBatis的前身就是著名的Ibatis,不知何故脱离了Apache改名为MyBatis。
MyBatis所说是轻量级的ORM框架,在网上看过一个测试报告,感觉相比于Hibernate来说,优势并不明显。

下面说一下比较有趣的现象,根据MyBatis的官方文档,在获得sqlSession时,它有为批量更新而专门准备的:

Java代码  收藏代码
  1. session = sessionFactory.openSession();//用于普通update  
  2. session = sessionFactory.openSession(ExecutorType.BATCH, true);//用于批量update  
 

 

 一般来说,对MYSQL数据库批量操作时速度取决于,是为每一个处理分别建立一个连接,还是为这一批处理一共建立一个连接。按MyBatis的手册说明,选择ExecutorType.BATCH意味着,获得的sqlSession会批量执行所有更新语句。不过我测试了一下,批量插入1000条数据,发觉ExecutorType.BATCH方式的效率居然比普通的方式差很多 。我测试用的Mapper中的insert配置如下,再用for循环插入1000条记录:
Xml代码  收藏代码
  1. <insert id="insert" parameterType="sdc.mybatis.test.Student">  
  2.      <!-- WARNING - @mbggenerated This element is automatically generated by   
  3.           MyBatis Generator, do not modify. This element was generated on Mon May 09   
  4.           11:09:37 CST 2011. -->  
  5.      insert into student (id, name, sex,  
  6.      address, telephone, t_id  
  7.      )  
  8.      values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},  
  9.     #{sex,jdbcType=VARCHAR},  
  10.     #{address,jdbcType=VARCHAR}, #{telephone,jdbcType=VARCHAR}, #{tId,jdbcType=INTEGER}  
  11.     )  
  12. </insert>  
 

 

1、 我不清楚原因在哪里, 就配置了MyBatis的log4j,想查看下日志。下载了log4j.jar和commons-logging.jar并配置到项目的类路径,然后在代码路径下新建文件log4j.properties,内容如下:

Xml代码  收藏代码
  1. log4j.rootLogger=DEBUG, stdout  
  2. # SqlMap logging configuration...  
  3. log4j.logger.com.ibatis=DEBUG  
  4. log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG  
  5. log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG  
  6. log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG  
  7. log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG  
  8. log4j.logger.com.ibatis.common.util.StopWatch=DEBUG  
  9. log4j.logger.java.sql.Connection=DEBUG  
  10. log4j.logger.java.sql.Statement=DEBUG  
  11. log4j.logger.java.sql.PreparedStatement=DEBUG  
  12. log4j.logger.java.sql.ResultSet=DEBUG  
  13.   
  14. # Console output...  
  15. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  16. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  17. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n  
 

2、然后再次测试普通的sqlSession,发现日志内容中虽然插入了1000条数据,但只新建了一次连接,最后又关闭了该连接(日志如下)。也就是说MyBatis中的普通sqlSession好像已经对批量插入默认是一次连接中完成,那么还提供ExecutorType.BATCH方式干什么,况且该方式好像效率也不行,或者是我使用ExecutorType.BATCH方式不对??3、最后一点是关于数据库批量插入时sql语句级的优化,我特意测试了两种方式,在StudentMapper中配置了两种insert模式。第一种对应insert value1,insert value2,,,,;第二种对应insert values (value1, value2,....)。发现后者果然比前者快很多啊。下面是两种insert模式,及测试结果对应图:

Xml代码  收藏代码
  1. DEBUG [main] - Created connection 3502256.  
  2. DEBUG [main] - ooo Connection Opened  
  3. DEBUG [main] - ==>  Executing: insert into student ( name, sex, address, telephone, t_id ) values ( ?, ?, ?, ?, ? )   
  4. DEBUG [main] - ==> Parameters: 新人0(String), male(String), addr0(String), dd(String), 3(Integer)  
  5. DEBUG [main] - ==>  Executing: insert into student ( name, sex, address, telephone, t_id ) values ( ?, ?, ?, ?, ? )   
  6. DEBUG [main] - ==> Parameters: 新人1(String), male(String),   
  7. ...............  
  8. ...............  
  9. DEBUG [main] - xxx Connection Closed  
  10. DEBUG [main] - Returned connection 3502256 to pool.  

 3、最后一点是关于数据库批量插入时sql语句级的优化,我特意测试了两种方式,在StudentMapper中配置了两种insert模式。第一种对应insert value1,insert value2,,,,;第二种对应insert values (value1, value2,....)。发现后者果然比前者快很多啊。下面是两种insert模式,及测试结果对应图:

 

Xml代码  收藏代码
  1. <!-- 在外部for循环调用一千次 -->  
  2. <insert id="insert" parameterType="sdc.mybatis.test.Student">  
  3.     insert into student (id, name, sex,  
  4.     address, telephone, t_id  
  5.     )  
  6.     values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},  
  7.     #{sex,jdbcType=VARCHAR},  
  8.     #{address,jdbcType=VARCHAR}, #{telephone,jdbcType=VARCHAR}, #{tId,jdbcType=INTEGER}  
  9.     )  
  10. </insert>  
  11. <!--  批量 ,传入一个长度为1000的list  -->  
  12. <insert id="insertBatch" >  
  13.     insert into student ( <include refid="Base_Column_List" /> )   
  14.     values   
  15.     <foreach collection="list" item="item" index="index" separator=",">  
  16.         (null,#{item.name},#{item.sex},#{item.address},#{item.telephone},#{item.tId})  
  17.     </foreach>  
  18. </insert>  
 

附录:

  1. MyBatis配置文件的DTD文件(与Ibatis3不同):http://mybatis.org/dtd/
  2. MyBatis的中文手册:http://mybatis.googlecode.com/files/MyBatis%203%20User%20Guide%20Simplified%20Chinese.pdf
18 
14 
分享到:  
评论
19 楼 乱_战 2012-05-24  
rensanning 写道
1、JDBC提供了数据库batch处理的能力,在数据大批量操作(新增、删除等)的情况下可以大幅度提升系统的性能。

Java代码  收藏代码
  1. // 关闭自动执行  
  2. con.setAutoCommit(false);  
  3. PreparedStatement stmt = con.prepareStatement("INSERT INTO employees VALUES (?, ?)");  
  4.   
  5. for ( int i = 0; i < 10000; i++) {  
  6.     stmt.setInt(1, i+1);  
  7.     stmt.setString(2"NAME "+(i+1));  
  8.     stmt.addBatch();  
  9. }  
  10.   
  11. // 提交要执行的批处理  
  12. int[] updateCounts = stmt.executeBatch();  


2、iBatis框架对batch处理的支持:

Java代码  收藏代码
  1. client.startBatch();  
  2.   
  3. for(int i = 0; i < 10000; i++) {  
  4.     client.delete("delete from order where id=?",i);  
  5. }  
  6.   
  7. client.executeBatch();  


3、Mybatis框架对batch处理的支持:

Java代码  收藏代码
  1. SqlSession session = sqlSessionFactory().openSession(ExecutorType.BATCH, false);  
  2.   
  3. for(int i = 0; i < 10000; i++) {  
  4.     session.delete("delete from order where id=?",i);  
  5. }  
  6.   
  7. session.commit();  
  8.   
  9. session.close();  


4、多行插入是数据库级别的,需要数据库的支持,跟框架,JDBC无关。
INSERT INTO <TABLE> subquery.
INSERT INTO <TABLE> VALUES (......),(......),(......)

****多行插入肯定是性能是最好的,他完全交给了DBMS来处理,但是类似于回滚,提交等业务处理你就没法控制了。
****由于框架的重写,Mybatis的性能比iBatis或者JDBC差很多
****任何ORM框架都要经由JDBC,所以从性能上来说: 纯SQL > JDBC > ORM框架

这里有MyBatis的发展经历http://www.mybatis.org/about.html,可以看出应该是作者和Apache基金会有分歧(Apache基金会对于代码,文档都要求很严),2004到2010的6年间,数据库有了很大的变化,但是iBatis版本一致没有大的改动。

不错
18 楼 king114963349 2012-05-24  
这个结果真是出人意料,版本升级了,但是效率却下来了 ,只得用jdbc了!
17 楼 lykm02 2012-05-24  
mysqldump  -uxxx -pxxxx userdatabase > custom.sql

大概是这么个样子,未测试。

qcyycom 写道
lykm02 写道
显然 insert into ... values (),(),() 快很多。
batch insert  比这个慢是再正常不过了。
你可以随便 dump 一个 database 出来,看看database生成的sql是怎么写的。
我想瞬间,你就了解了。

如何 dump 一个 database 出来 ?
16 楼 lykm02 2012-05-24  
是的。他是非常快。
数据太多也会报错。
这个很正常。
大概是mysql 会根据他自己的cache size 来进行切分。
但是如果 values 后面值太多,他的cache 放不下,自然要报错的。

即便是mysql 自己的dump,如果你的数据量够大,你会发现,一张表他是会dump成若干条
insert into ... values() **

既然mysql 自己的dump工具都会做这件事,那肯定说明数据太多是要出错的。关键是这个阈值是多少,估计这个和每台server的设置有关。
所以肯定不能数据太多。


shenliuyang 写道
  你用得那种values 是不行的,  数据太多就会报错, 我一开始也是这样用,发现速度非常快,  但后来深受其苦。  mysql 都报错了。
15 楼 mixer_a 2012-05-23  
 
14 楼 shenliuyang 2012-05-23  
  你用得那种values 是不行的,  数据太多就会报错, 我一开始也是这样用,发现速度非常快,  但后来深受其苦。  mysql 都报错了。
13 楼 lyunabc 2012-05-23  
hualee 写道
qcyycom 写道
lykm02 写道
显然 insert into ... values (),(),() 快很多。
batch insert  比这个慢是再正常不过了。
你可以随便 dump 一个 database 出来,看看database生成的sql是怎么写的。
我想瞬间,你就了解了。

如何 dump 一个 database 出来 ?

应该在数据库服务器上打开statement的日志,你就明白了

我也想知道
12 楼 hualee 2012-05-23  
qcyycom 写道
lykm02 写道
显然 insert into ... values (),(),() 快很多。
batch insert  比这个慢是再正常不过了。
你可以随便 dump 一个 database 出来,看看database生成的sql是怎么写的。
我想瞬间,你就了解了。

如何 dump 一个 database 出来 ?

应该在数据库服务器上打开statement的日志,你就明白了
11 楼 wangranfeng 2012-05-23  
初学MyBatis一直在找批量插入的例子,可以把Base_Column_List的代码段发一下吗?
谢谢
10 楼 季铵盐 2012-05-23  
既然上了框架,对于大型的项目稳定是最重要的,要快的话 jdbc本身的addbatch()就够快 
9 楼 zljpp 2012-05-22  
vb2005xu 写道
用这破玩意 还不如 使用dbutils爽呢

hehe ,莫激动
8 楼 qcyycom 2012-05-22  
rensanning 写道
1、JDBC提供了数据库batch处理的能力,在数据大批量操作(新增、删除等)的情况下可以大幅度提升系统的性能。

Java代码  收藏代码
  1. // 关闭自动执行  
  2. con.setAutoCommit(false);  
  3. PreparedStatement stmt = con.prepareStatement("INSERT INTO employees VALUES (?, ?)");  
  4.   
  5. for ( int i = 0; i < 10000; i++) {  
  6.     stmt.setInt(1, i+1);  
  7.     stmt.setString(2"NAME "+(i+1));  
  8.     stmt.addBatch();  
  9. }  
  10.   
  11. // 提交要执行的批处理  
  12. int[] updateCounts = stmt.executeBatch();  


2、iBatis框架对batch处理的支持:

Java代码  收藏代码
  1. client.startBatch();  
  2.   
  3. for(int i = 0; i < 10000; i++) {  
  4.     client.delete("delete from order where id=?",i);  
  5. }  
  6.   
  7. client.executeBatch();  


3、Mybatis框架对batch处理的支持:

Java代码  收藏代码
  1. SqlSession session = sqlSessionFactory().openSession(ExecutorType.BATCH, false);  
  2.   
  3. for(int i = 0; i < 10000; i++) {  
  4.     session.delete("delete from order where id=?",i);  
  5. }  
  6.   
  7. session.commit();  
  8.   
  9. session.close();  


4、多行插入是数据库级别的,需要数据库的支持,跟框架,JDBC无关。
INSERT INTO <TABLE> subquery.
INSERT INTO <TABLE> VALUES (......),(......),(......)

****多行插入肯定是性能是最好的,他完全交给了DBMS来处理,但是类似于回滚,提交等业务处理你就没法控制了。
****由于框架的重写,Mybatis的性能比iBatis或者JDBC差很多
****任何ORM框架都要经由JDBC,所以从性能上来说: 纯SQL > JDBC > ORM框架

这里有MyBatis的发展经历http://www.mybatis.org/about.html,可以看出应该是作者和Apache基金会有分歧(Apache基金会对于代码,文档都要求很严),2004到2010的6年间,数据库有了很大的变化,但是iBatis版本一致没有大的改动。

+
7 楼 com_xpp 2012-05-22  
vb2005xu 写道
用这破玩意 还不如 使用dbutils爽呢

这玩意还是不错的
6 楼 vb2005xu 2012-05-22  
用这破玩意 还不如 使用dbutils爽呢
5 楼 rensanning 2012-05-22  
1、JDBC提供了数据库batch处理的能力,在数据大批量操作(新增、删除等)的情况下可以大幅度提升系统的性能。

Java代码  收藏代码
  1. // 关闭自动执行  
  2. con.setAutoCommit(false);  
  3. PreparedStatement stmt = con.prepareStatement("INSERT INTO employees VALUES (?, ?)");  
  4.   
  5. for ( int i = 0; i < 10000; i++) {  
  6.     stmt.setInt(1, i+1);  
  7.     stmt.setString(2"NAME "+(i+1));  
  8.     stmt.addBatch();  
  9. }  
  10.   
  11. // 提交要执行的批处理  
  12. int[] updateCounts = stmt.executeBatch();  


2、iBatis框架对batch处理的支持:

Java代码  收藏代码
  1. client.startBatch();  
  2.   
  3. for(int i = 0; i < 10000; i++) {  
  4.     client.delete("delete from order where id=?",i);  
  5. }  
  6.   
  7. client.executeBatch();  


3、Mybatis框架对batch处理的支持:

Java代码  收藏代码
  1. SqlSession session = sqlSessionFactory().openSession(ExecutorType.BATCH, false);  
  2.   
  3. for(int i = 0; i < 10000; i++) {  
  4.     session.delete("delete from order where id=?",i);  
  5. }  
  6.   
  7. session.commit();  
  8.   
  9. session.close();  


4、多行插入是数据库级别的,需要数据库的支持,跟框架,JDBC无关。
INSERT INTO <TABLE> subquery.
INSERT INTO <TABLE> VALUES (......),(......),(......)

****多行插入肯定是性能是最好的,他完全交给了DBMS来处理,但是类似于回滚,提交等业务处理你就没法控制了。
****由于框架的重写,Mybatis的性能比iBatis或者JDBC差很多
****任何ORM框架都要经由JDBC,所以从性能上来说: 纯SQL > JDBC > ORM框架

这里有MyBatis的发展经历http://www.mybatis.org/about.html,可以看出应该是作者和Apache基金会有分歧(Apache基金会对于代码,文档都要求很严),2004到2010的6年间,数据库有了很大的变化,但是iBatis版本一致没有大的改动。
4 楼 dyllove98 2012-05-22  
 测试的准确吗?
3 楼 a897301704 2012-05-22  
   
2 楼 qcyycom 2012-05-22  
lykm02 写道
显然 insert into ... values (),(),() 快很多。
batch insert  比这个慢是再正常不过了。
你可以随便 dump 一个 database 出来,看看database生成的sql是怎么写的。
我想瞬间,你就了解了。

如何 dump 一个 database 出来 ?
1 楼 lykm02 2012-05-22  
显然 insert into ... values (),(),() 快很多。
batch insert  比这个慢是再正常不过了。
你可以随便 dump 一个 database 出来,看看database生成的sql是怎么写的。
我想瞬间,你就了解了。
分享到:
评论

相关推荐

    mybatis_insertbatch_db.rar

    总之,这个压缩包提供的学习资源涵盖了SpringBoot与MyBatis集成、MyBatis批量插入的最佳实践、以及如何通过性能测试评估和优化数据库操作。通过研究这个例子,开发者可以更好地理解如何在大数据量的情况下提高应用的...

    制造大数据量java脚本,批量写入脚本

    在IT行业中,大数据量的处理是一项常见的挑战,尤其是在测试、数据分析和系统性能验证等场景下。Java作为一种广泛使用的编程语言,常被用来处理这类任务。本文将深入探讨如何使用Java编写脚本来制造大量数据并批量...

    Spring 3.x企业应用开发实战.pdf

    7. **Spring Batch**:对于批量处理和大数据操作,Spring Batch提供了一套完整的解决方案,包括读取、处理和写入大量数据的能力。 8. **Spring Security**:Spring的安全模块提供了一套强大的认证和授权机制,可以...

    java spring框架,技术详解及使用指导

    9. **Spring Batch**:用于批量处理任务的模块,支持复杂的数据处理场景,如大数据导入导出。 10. **测试支持**:Spring框架提供了对单元测试和集成测试的强大支持,包括模拟对象、测试注解和测试上下文框架。 在...

    分享Spring in Action Third Edition 正版ebook

    9. **Spring与其他技术的集成**:Spring可以与众多开源技术如Spring Data(大数据访问)、Spring Batch(批量处理)、Spring Integration(企业服务总线)等无缝集成,提升开发效率。 总的来说,《Spring in Action...

    基于SSM+jsp的宿舍管理系统源码数据库文档.zip

    4. 测试调试:单元测试、集成测试,确保系统功能的正确性和稳定性。 5. 部署上线:打包应用,部署到服务器,进行性能优化和监控。 五、未来扩展 1. 移动端适配:考虑其他移动平台的支持,如Android或iOS应用。 2. ...

    Spring in action+中文版(第4版)spring 实践 高清目录版

    通过《Spring in Action》中文版第4版的学习,读者不仅可以掌握Spring框架的基础知识,还能了解到Spring如何与其他技术(如Java EE、大数据、云计算等)集成,从而提升开发效率和应用质量。书中高清目录版的设置,更...

    黑马智慧物业管理系统讲义

    1. **智慧物业的概念**:智慧物业是利用物联网、云计算、大数据等信息技术手段,整合社区内各种资源和服务,构建的一种新型物业管理模式。 2. **智慧物业的发展趋势**: - **技术融合**:随着AI、5G等新技术的应用...

    基于jsp的网上文玩销售系统设计与实现.docx

    随着5G、大数据、人工智能等技术的发展,未来网上文玩销售系统可以进一步引入智能推荐算法,根据用户的浏览历史和购买行为,个性化推荐文玩产品。同时,可以考虑开发移动客户端,充分利用移动端的优势,提高用户粘性...

    跟我学spring3

    在Spring3版本中,它引入了许多改进和新特性,包括增强的声明式事务管理、对Java配置的支持、以及与大数据和云计算平台更好的集成。下面,我们将详细探讨这些关键知识点: 1. **依赖注入**:Spring的核心特性之一,...

    springboot整合elasticsearch8.3并通过rabbitMq同步mysql数据库的demo

    - **批量操作**:为了提高效率,可以将接收到的多条数据库变更消息合并,然后批量写入Elasticsearch。 - **错误处理**:确保有合适的错误处理机制,如重试、日志记录,以应对可能出现的网络问题或Elasticsearch的...

    easyexcel-demo-master.zip

    3. **模板文件**:在 `src/main/resources` 目录下,可能有一些示例的 Excel 模板文件,供开发者参考和测试。这些文件可能是空的,也可能是预填充了一些数据的模板,用于演示 EasyExcel 如何处理各种格式和内容的 ...

    SRRING帮助文档

    - 利用Spring Batch处理大数据批量导入导出。 综上,Spring框架通过其灵活的设计和强大的功能,极大地提升了Java开发的效率和质量。借助提供的中文帮助文档,开发者可以更深入地了解和掌握Spring,从而在实际项目中...

    Java教务管理系统

    4. 测试调试:对系统进行全面的功能测试和性能测试,修复可能出现的问题。 5. 部署上线:将系统部署到服务器上,进行实际运行。 6. 维护更新:根据用户反馈进行持续优化,添加新的功能。 四、未来发展趋势 随着...

    一个经典的数据库访问层实现

    9. 批量操作:在处理大量数据时,批量操作可以显著提升性能。数据库访问层应支持批处理SQL语句,以减少网络往返次数。 10. 分页查询和分库分表:在大数据场景下,分页查询和数据库的水平扩展(分库分表)是常见的...

    帕克雷德罗:春天的普罗维克托山

    7. **Spring Batch**:处理批量处理任务,如大数据导入导出、定时任务等。 8. **Spring Integration**:为企业级集成提供了一种声明式的方法,用于处理系统间的异步通信。 9. **Spring Cloud**:一套微服务解决...

    三十种IT技术架构师知识汇总-1.rar

    1. **JAVA架构师**:Java架构师精通Java编程语言,理解JVM工作原理,熟悉Spring框架、MyBatis等工具。他们设计可重用的组件,优化性能,并处理并发和多线程问题。此外,他们还需了解Java EE(企业版)和Java SE...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    大数据与nosql zookeeper hadoop hbase mongodb strom spark java语言 语言语法基础 异常 泛型 内部类 反射 序列化 nIo 匿名类 包装类 优先级 引用 语言工具类库 容器类 集合 链表 map ...

    基于SpringBoot的在线视频教育平台源码数据库.docx

    5. **测试与优化**:对系统进行全面的测试,确保其稳定性和安全性,并根据反馈进行相应的优化调整。 #### 四、关键技术介绍 1. **SpringBoot框架**: - **简介**:SpringBoot是由Pivotal团队提供的全新框架,旨在...

Global site tag (gtag.js) - Google Analytics