关于 MyBatis MyBatis-Spring Jdbc 批量插入的各种比较分析
因为目前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 批量插入的各种比较分析的更多相关文章
- spring jdbc批量插入
http://blog.csdn.net/fyqcdbdx/article/details/7366439
- Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1 背景 系统中需要批量生成单据数据到数据库表,所以采用 ...
- 三种JDBC批量插入编程方法的比较
JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等. 我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法一,使用PreparedStat ...
- jdbc批量插入
分享牛,分享牛原创.有这样一个需求,文本文件中的数据批量的插入mysql,怎么用jdbc方式批量插入呢? jdbc默认提供了批量插入的方法,可能用一次就忘记了,这里做笔记记录一下jdbc批量插入吧. ...
- JDBC批量插入数据优化,使用addBatch和executeBatch
JDBC批量插入数据优化,使用addBatch和executeBatch SQL的批量插入的问题,如果来个for循环,执行上万次,肯定会很慢,那么,如何去优化呢? 解决方案:用 preparedSta ...
- 【MyBatis】几种批量插入效率的比较
批处理数据主要有三种方式: 反复执行单条插入语句 foreach 拼接 sql 批处理 一.前期准备 基于Spring Boot + Mysql,同时为了省略get/set,使用了lombok,详见p ...
- MyBatis向数据库中批量插入数据
Foreach标签 foreach: collection:指定要遍历的集合; 表示传入过来的参数的数据类型.该参数为必选.要做 foreach 的对象,作为入参时,List 对象默认用 list 代 ...
- mybatis 注解的方式批量插入,更新数据
一,当向数据表中插入一条数据时,一般先检查该数据是否已经存在,如果存在更新,不存在则新增 使用关键字 ON DUPLICATE KEY UPDATE zk_device_id为主键 model ...
- mybatis使用foreach进行批量插入和删除操作
一.批量插入 1.mapper层 int insertBatchRoleUser(@Param("lists") List<RoleUser> lists);//@Pa ...
随机推荐
- 谈谈 css 的各种居中——读编写高质量代码有感
css 的居中有水平居中和垂直居中,这两种居中又分为行内元素居中和块级元素居中,不同的居中用不同方法. 水平居中 1.行内元素水平居中(文本,图片) 给父层设置 text-align:center; ...
- Asp.Net长文件名下载的问题和解决办法
在Asp.Net中写了一个附件上传和下载的程序,附件上传到数据库中,然后将附件的GUID保存起来,我们可以根据GUID来找到数据库中的附件,一般附件下载的代码是: <!--<br /> ...
- iOS开发之网络请求(基于AFNetworking的再封装)
最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...
- file_get_contents()的另一种使用方法
今天在网上看到一篇挺不错的文章,拿过来保存学习一下.本文源地址为:http://www.kuitao8.com/20140727/2867.shtml $data = file_get_content ...
- HTML 5 学习之应用程序缓存
什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏 ...
- IScroll5+在ios、android点击(click)事件不兼容解决方法
Bug描述: ios.android4.4+下不能触发click事件. Bug解决: 调用iscroll插件,增加配置参数:click:true/false click的值是要根据移动终端设备进行判断 ...
- jquery的选项卡事件
<?php /* * * @Authors peng--jun * @Email 1098325951@qq.com * @Date 2015-11-28 09:26:54 * @Link ht ...
- Android之Adapter用法总结
http://blog.csdn.net/fznpcy/article/details/8658155 Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器 ...
- Delphi检测网络连接状态
有时候,我们做一些小软件就需要检测网络连接状态,比如想给你的软件加上类似QQ那样的系统消息,可是像我这样的穷人肯定是买不起服务器了,那我们只好另想办法,可以读取网页然后用浏览器显示,这个时候就需要判断 ...
- Android 禁止软键盘自动弹出
Android系统对EditText这个控件有监听功能,如果某个Activity中含有该控件,就会自动弹出软键盘让你输入,这个看似人性化的方案有 时候并不被用户喜欢的,所以在有些情况下要禁用该功能.这 ...