因为目前SME项目中编写了一套蜘蛛爬虫程序,所以导致插入数据库的数据量剧增。就项目中使用到的3种DB插入方式进行了一个Demo分析:

具体代码如下:

1: MyBatis 开启Batch方式,最普通的带自动事务的插入:  

  1.     SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, true);
  2. try {
  3.  
  4. Date dt1 = new Date();
  5.  
  6. SemAccountMapper dao = session.getMapper(SemAccountMapper.class);
  7. dao.addSemAccountBatch(accounts);
  8. //session.commit();
  9. //session.clearCache();
  10. Date dt2 = new Date();
  11.  
  12. return (dt2.getTime() - dt1.getTime()) / 1000.0;
  13.  
  14. } catch (Exception e) {
  15. session.rollback();
  16. throw e;
  17. }   

1.1 开启Batch,但不使用自动事务

  1. SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
  2. try {
  3.  
  4. Date dt1 = new Date();
  5.  
  6. SemAccountMapper dao = session.getMapper(SemAccountMapper.class);
  7. dao.addSemAccountBatch(accounts);
  8. session.commit();
  9. session.clearCache();
  10. Date dt2 = new Date();
  11.  
  12. return (dt2.getTime() - dt1.getTime()) / 1000.0;
  13.  
  14. }

2: MyBatis_spring 普通的插入

  1. SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, true);
  2. try {
  3. Date dt1 = new Date();
  4. SemAccountMapper dao = session.getMapper(SemAccountMapper.class);
  5. dao.addSemAccountBatch(accounts);
  6. session.commit();
  7. session.clearCache();
  8. Date dt2 = new Date();
  9. return (dt2.getTime() - dt1.getTime()) / 1000.0;
  10. }

3:Jdbc 批量操作,设置普通连接字符串

  1. public static final String DBURL = "jdbc:mysql://192.168.21.225:3306/sem";
  2.  
  3.      Connection con = null; // 表示数据库的连接对象
  4. Class.forName(DBDRIVER); // 1、使用CLASS 类加载驱动程序
  5. con = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 2、连接数据库
  6.  
  7. try {
  8. con.setAutoCommit(false);
  9. String sql = "Insert into" + " sem_account(ClientId,Name,SEAccountName,SEPassword,SEStatus,Status,CreatorId,CreatedTime,LastChanged) " + " Values "
  10. + " (?,?,?,?,?,?,?,?,?) ";
  11. PreparedStatement prest = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
  12.  
  13. for (int i = 0; i < length; i++) {
  14. prest.setInt(1, 1);
  15. prest.setString(2, i + "");
  16. prest.setString(3, i + "");
  17. prest.setString(4, i + "");
  18. prest.setInt(5, 1);
  19. prest.setInt(6, 1);
  20. prest.setInt(7, 1);
  21. prest.setString(8, DateUtil.getCurrentDate());
  22. prest.setString(9, DateUtil.getCurrentDate());
  23. prest.addBatch();
  24. }
  25.  
  26. Date dt1 = new Date();
  27.  
  28. prest.executeBatch();
  29. con.commit();
  30.  
  31. Date dt2 = new Date();
  32.  
  33. return (dt2.getTime() - dt1.getTime()) / 1000.0;
  34. }

3.1 设置批量连接字符串 rewriteBatchedStatements=true,与上面不同的只有连接字符串不同

  1. public static final String DBURL = "jdbc:mysql://192.168.21.225:3306/sem?rewriteBatchedStatements=true";

  

以上所有方法,在测试程序中,都执行2次,防止有连接池缓存影响速度上的判断,插入数据库数据位10w条数据,得到以下分析结果:

插入数据库方式 第一次插入10w条时间(s) 第二次插入10w条时间(s)
MyBatis 开启Batch 自动事务提交 42.703 35.747
MyBatis 开启Batch  关闭自动事务,自提交 38.875 40.285
MyBatis-Spring 普通提交 37.199 36.607
Jdbc 批量操作,普通连接字符串 98.589 97.973
Jdbc 批量操作,设置批量操作字符串 3.311 3.244

从以上操作来看,其中Mybatis自动事务,和Mybatis-Spring 的方法所用时间基本一致,

而最快的操作在 Jdbc 带上批量操作参数以后的速度 3.244s。

附带InsertBatch的Mapper文件

  1. <insert id="addSemAccountBatch" parameterType="SemAccount">
  2. Insert into sem_account
  3. (ClientId,Name,SyncId,SyncTime,SEId,SESyncTime,SEAccountName,SEPassword,SEApiToken,SEStatus,Cost,BudgetPerDay,Balance,Payment,ExcludeIps,RegionTargets,OpenDomains,BudgetOfflineTime,Remark,WarningRemainingDays,WarningRemainingCost,Status,CreatorId,CreatedTime,LastChanged,SearchEngineType,SearchEngineConstId)
  4. Values
  5. <foreach collection="list" item="item" index="index"
  6. separator=",">
  7. (#{item.clientId},#{item.name},#{item.syncId},#{item.syncTime},#{item.sEId},#{item.sESyncTime},#{item.sEAccountName},#{item.sEPassword},#{item.sEApiToken},#{item.sEStatus},#{item.cost},#{item.budgetPerDay},#{item.balance},#{item.payment},#{item.excludeIps},#{item.regionTargets},#{item.openDomains},#{item.budgetOfflineTime},#{item.remark},#{item.warningRemainingDays},#{item.warningRemainingCost},#{item.status},#{item.creatorId},#{item.createdTime},#{item.lastChanged},#{item.searchEngineType},#{item.searchEngineConstId})
  8. </foreach>
  9. </insert>

关于 MyBatis MyBatis-Spring Jdbc 批量插入的各种比较分析的更多相关文章

  1. spring jdbc批量插入

    http://blog.csdn.net/fyqcdbdx/article/details/7366439

  2. Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案

    转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1      背景 系统中需要批量生成单据数据到数据库表,所以采用 ...

  3. 三种JDBC批量插入编程方法的比较

    JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等. 我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法一,使用PreparedStat ...

  4. jdbc批量插入

    分享牛,分享牛原创.有这样一个需求,文本文件中的数据批量的插入mysql,怎么用jdbc方式批量插入呢? jdbc默认提供了批量插入的方法,可能用一次就忘记了,这里做笔记记录一下jdbc批量插入吧. ...

  5. JDBC批量插入数据优化,使用addBatch和executeBatch

    JDBC批量插入数据优化,使用addBatch和executeBatch SQL的批量插入的问题,如果来个for循环,执行上万次,肯定会很慢,那么,如何去优化呢? 解决方案:用 preparedSta ...

  6. 【MyBatis】几种批量插入效率的比较

    批处理数据主要有三种方式: 反复执行单条插入语句 foreach 拼接 sql 批处理 一.前期准备 基于Spring Boot + Mysql,同时为了省略get/set,使用了lombok,详见p ...

  7. MyBatis向数据库中批量插入数据

    Foreach标签 foreach: collection:指定要遍历的集合; 表示传入过来的参数的数据类型.该参数为必选.要做 foreach 的对象,作为入参时,List 对象默认用 list 代 ...

  8. mybatis 注解的方式批量插入,更新数据

    一,当向数据表中插入一条数据时,一般先检查该数据是否已经存在,如果存在更新,不存在则新增  使用关键字  ON DUPLICATE KEY UPDATE zk_device_id为主键 model  ...

  9. mybatis使用foreach进行批量插入和删除操作

    一.批量插入 1.mapper层 int insertBatchRoleUser(@Param("lists") List<RoleUser> lists);//@Pa ...

随机推荐

  1. 自定义按照index和key访问的List

    List<T>用起来比较方便,但是有时候要按照Index来访问List中的对象有些繁琐,所以想是不是扩展一下,既能按照Index来访问,又能按照Key访问. 实现方法: public cl ...

  2. (原) Jquery 判断设备是PC端,还是移动端

    判断设备是PC端,还是移动端 var ua = navigator.userAgent.toLocaleLowerCase(); var pf = navigator.platform.toLocal ...

  3. ssh框架搭建时报错

     java.lang.UnsupportedClassVersionError: com/microsoft/ sqllserver/ jdbc/SQLServerDriver : Unsupport ...

  4. iOS设计模式解析(三)适配器模式

    适配器模式:将一个类的借口转换成客户端希望的另一个接口 有一个很直观的图: 例如      :电源适配器(将110V电压转换成220V电压,其中Traget是220V电压,adaptee就是110V电 ...

  5. MySQL表结构同步工具 mysql-schema-sync

    mysql-schema-sync 是一款使用go开发的.跨平台的.绿色无依赖的 MySQL 表结构自动同步工具.用于将线上(其他环境)数据库结构变化同步到测试(本地)环境! 可以解决多人开发,每人都 ...

  6. Which PHP mode? Apache vs CGI vs FastCGI

    Which PHP mode? Apache vs CGI vs FastCGI There are multiple ways to execute PHP scripts on a web ser ...

  7. Python学习路径和个人增值(整合版)

    PS:内容来源于网络 一.简介         Python是一种面向对象.直译式计算机程序设计语言,由Guido van Rossum于1989年底发明.由于他简单.易学.免费开源.可移植性.可扩展 ...

  8. CPrimer Plus第12章 存储类、链接和内存管理随笔

    被static修饰的属于内部链接,不可被外部程序文件所使用一般而言,全局变量(文件作用域变量)具有静态存储期,局部变量(代码块作用域变量)具有自动存储期寄存器变量不能使用地址运算符因为被static修 ...

  9. 安装solaris_11.2与windows双系统(VM10模拟实现)(二)

    下面我们在虚拟机下安装双系统 1.首先我们新建一个虚拟机 新建的时候一定要注意客户机操作系统应选择solaris,不然不行: 新建完成后我们先分两个分区,这里我先从U盘启动进去(也可以用xp/win7 ...

  10. css 问题总结

    background: <color> <image> <position> <attachment> <repeat>本文来自:佳木中国( ...