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

具体代码如下:

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

    SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, true);
try { Date dt1 = new Date(); SemAccountMapper dao = session.getMapper(SemAccountMapper.class);
dao.addSemAccountBatch(accounts);
//session.commit();
//session.clearCache();
Date dt2 = new Date(); return (dt2.getTime() - dt1.getTime()) / 1000.0; } catch (Exception e) {
session.rollback();
throw e;
}   

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

        SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
try { Date dt1 = new Date(); SemAccountMapper dao = session.getMapper(SemAccountMapper.class);
dao.addSemAccountBatch(accounts);
session.commit();
session.clearCache();
Date dt2 = new Date(); return (dt2.getTime() - dt1.getTime()) / 1000.0; }

2: MyBatis_spring 普通的插入

        SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, true);
try {
Date dt1 = new Date();
SemAccountMapper dao = session.getMapper(SemAccountMapper.class);
dao.addSemAccountBatch(accounts);
session.commit();
session.clearCache();
Date dt2 = new Date();
return (dt2.getTime() - dt1.getTime()) / 1000.0;
}

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

        public static final String DBURL = "jdbc:mysql://192.168.21.225:3306/sem";

     Connection con = null; // 表示数据库的连接对象
Class.forName(DBDRIVER); // 1、使用CLASS 类加载驱动程序
con = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 2、连接数据库 try {
con.setAutoCommit(false);
String sql = "Insert into" + " sem_account(ClientId,Name,SEAccountName,SEPassword,SEStatus,Status,CreatorId,CreatedTime,LastChanged) " + " Values "
+ " (?,?,?,?,?,?,?,?,?) ";
PreparedStatement prest = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); for (int i = 0; i < length; i++) {
prest.setInt(1, 1);
prest.setString(2, i + "");
prest.setString(3, i + "");
prest.setString(4, i + "");
prest.setInt(5, 1);
prest.setInt(6, 1);
prest.setInt(7, 1);
prest.setString(8, DateUtil.getCurrentDate());
prest.setString(9, DateUtil.getCurrentDate());
prest.addBatch();
} Date dt1 = new Date(); prest.executeBatch();
con.commit(); Date dt2 = new Date(); return (dt2.getTime() - dt1.getTime()) / 1000.0;
}

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

       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文件

    <insert id="addSemAccountBatch" parameterType="SemAccount">
Insert into sem_account
(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)
Values
<foreach collection="list" item="item" index="index"
separator=",">
(#{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})
</foreach>
</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. [jQuery]无法获取隐藏元素(display:none)宽度(width)和高度(height)的新解决方案

    在做茶城网改版工作的时候,又遇到一个新问题,我需要用jQuery写一个通过点击左右图标来翻阅图片的小插件,写好后测试可以正常运行,但是放到Tab中后发现只有第一个Tab中的代码能够正常运行,其它全部罢 ...

  2. 2016年gift上线相关知识点记录

    1.图片初始化加载 2.如何判断横屏 function horAver() { if (window.orientation == 90 || window.orientation == -90) { ...

  3. EditText默认不显示光标,不可编辑,点击它,进入编辑状态,光标显示

    设置EditText不可编辑,光标不可见: et.setCursorVisible(false); 设置EditText可编辑,光标可见: et.setOnClickListener(new OnCl ...

  4. linux下Java环境的配置

    linux下Java环境的配置 现在用linux的朋友越来越多了,前几天就有两个朋友问我linux下怎么配置java环境,我想还有很多朋友想了解学习这方面的东西,就写一个完全一点的linux java ...

  5. 跳转APP(app之间互相通信)

    摘要 步骤: 1,添加URL Types项 2,配置URL Scheme 3,其他应用的跳转 4,参数的接收   开发IOS项目的时候,有可能会遇到两个APP应用相互调用的需求,比如说:支付宝支付.. ...

  6. Swift和Objective-C的差异性

    1:Type Swift提供了类型推断,不需要人工的去注释变量的类型信息,编译器会通过变量的值来推断类型.例如,编译器可以自动将该变量设置为字符串: // 自动推断,不显示 var name1 = & ...

  7. ASP.NET 生命周期(原文翻译)

    在网上看到这篇文章,老外写的,里面很多图片挺精致,顺带翻译过来给大家分享下,英语太次好多地方都翻不过来 ASP.NET application and page life cycle Download ...

  8. Linux下 静态链接库 和 动态链接库

    先来说说C/C++编译过程 编译: 检查语句符号定义,将C/C++代码翻译生成中间语言. 链接: 将中间代码整合,生成可执行的二进制代码. 简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特 ...

  9. 关于 zend studio 中有些php 内置函数没有提示,或是有‘小黄色感叹号’

    解决办法: 1.修改项目 .buildpath 文件 <?xml version="1.0" encoding="UTF-8"?> <buil ...

  10. [转载] 高大上的 CSS 效果:Shape Blobbing

    这篇大部分是转载,来自<高大上的 CSS 效果:Shape Blobbing>和 <Shape Blobbing in CSS> 有部分是自己理解和整理,配合效果要做出 app ...