设为首页 收藏本站
查看: 487|回复: 0

[经验分享] MyBatis-spring和spring JDBC批量插入Mysql的效率比较

[复制链接]

尚未签到

发表于 2016-10-23 06:47:04 | 显示全部楼层 |阅读模式
  工具框架用spring-batch,数据库是mysql(未做特殊优化)。
  比较数据框架mybatis和spring jdbc的插入效率。
  
  Mybatis三种实现:
  1、mybatis的官方写法

public void batchInsert1(List<Poi> poilist) throws Exception {
SqlSession sqlSession = sqlSessionFactory.getObject().openSession(ExecutorType.BATCH);
PoiMapper pmapper = sqlSession.getMapper(PoiMapper.class);
try {
for (Poi poi : poilist) {
pmapper.insertPoi(poi);
}
sqlSession.commit();
} finally {
sqlSession.close();
}
}
  其中Poi是一个bean。
  PoiMapper定义:

public interface PoiMapper {
@Insert("insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (#{tag}, GeomFromText(#{point}), #{poiid}, #{meshid}, #{owner}, #{featcode}, #{sortcode}, #{namec}, #{namee}, #{namep}, #{names}) ")
public void insertPoi(Poi poi);
}
  
  2、利用mysql特性,拼写insert sql。

public void batchInsert2(List<Poi> poilist) throws Exception {
SqlSession sqlSession = sqlSessionFactory.getObject().openSession(ExecutorType.BATCH);
try {
sqlSession.insert("com.emg.trans.mapper.batchMapper.batchInsert", poilist);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
  
  “com.emg.trans.mapper.batchMapper.batchInsert”在mybatis的xml中定义的sql,定义如下:

<mapper namespace="com.emg.trans.mapper.batchMapper">
<insert id="batchInsert" parameterType="List">
insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values
<foreach collection="list" item="poi" index="index" separator="," >
(#{poi.tag}, GeomFromText(#{poi.point}), #{poi.poiid}, #{poi.meshid}, #{poi.owner}, #{poi.featcode}, #{poi.sortcode}, #{poi.namec}, #{poi.namee}, #{poi.namep}, #{poi.names})
</foreach>
</insert>
</mapper>
  
  3、利用spring的事务,直接执行插入操作。

@Transactional("dbTransaction")
public void batchInsert3(List<Poi> poilist) throws Exception {
for (Poi poi : poilist) {
apmapper.insertPoi(poi);
}
}
  apmapper是PoiMapper的实例,用@Autowired配置。
  
  
  Spring-JDBC的三种实现:
  A、用spring事务执行插入操作

@Transactional("dbTransaction")
public void batchInsertJDBC1(List<Poi> poilist) throws DataAccessException {
String sql = "insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (?, GeomFromText(?), ?, ?, ?, ?, ?, ?, ?, ?, ?)";
for (Poi poi : poilist) {
Object[] args = {poi.getTag(), poi.getPoint(), poi.getPoiid(), poi.getMeshid(), poi.getOwner(), poi.getFeatcode(), poi.getSortcode(), poi.getNamec(),
poi.getNamee(), poi.getNamep(), poi.getNames()};
jdbcTemplate.update(sql, args);
}
}
  
  B、用spring事务和springjdbc的batchUpdate

@Transactional("dbTransaction")
public void batchInsertJDBC2(List<Poi> poilist) throws DataAccessException {
String sql = "insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (?, GeomFromText(?), ?, ?, ?, ?, ?, ?, ?, ?, ?)";
List<Object[]> batchArgs = new ArrayList<Object[]>();
for (Poi poi : poilist) {
Object[] args = {poi.getTag(), poi.getPoint(), poi.getPoiid(), poi.getMeshid(), poi.getOwner(), poi.getFeatcode(), poi.getSortcode(), poi.getNamec(),
poi.getNamee(), poi.getNamep(), poi.getNames()};
batchArgs.add(args);
}
jdbcTemplate.batchUpdate(sql, batchArgs);
}
  
  C、用spring事务,利用mysql特性,拼写insert sql。

@Transactional("dbTransaction")
public void batchInsertJDBC3(List<Poi> poilist) throws DataAccessException {
StringBuffer sqlbuf = new StringBuffer()
.append("insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values ");
MessageFormat form = new MessageFormat("(''{0}'', GeomFromText(''{1}''), ''{2}'', ''{3}'', ''{4}'', ''{5}'', ''{6}'', ''{7}'', ''{8}'', ''{9}'', ''{10}''),");
for (Poi poi : poilist) {
Object[] args = {poi.getTag(), poi.getPoint(), poi.getPoiid(), poi.getMeshid(), poi.getOwner(), poi.getFeatcode(), poi.getSortcode(), poi.getNamec().replaceAll("'", "\\\\'"),
poi.getNamee().replaceAll("'", "\\\\'"), poi.getNamep().replaceAll("'", "\\\\'"), poi.getNames().replaceAll("'", "\\\\'")};
sqlbuf.append(form.format(args));
}
String sql = sqlbuf.toString();
sql = sql.substring(0, sql.length()-1);
jdbcTemplate.update(sql);
}
  
  测试一:每次处理100条,共600条。
  测试二:每次处理1000条,共9000条。
  直接上结论:
  mybatis.1最慢。而且慢很多,很多。
  mybatis.2很快。是mybatis中最快的。
  mybatis.3比2慢一点。
  jdbc.A比B稍快,两者差不多,和mybatis.3也在伯仲之间。
  jdbc.C最快,比其他5种都快。
  大排行,从用时少到用时多:
  jdbc.C < mybatis.2 < jdbc.A < jdbc.B , mybatis.3 << mybatis.1

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-289949-1-1.html 上篇帖子: java程序存取 mysql 数据库的 clob 和blob 字段 下篇帖子: MySQL目前不支持列的Default 为函数的形式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表