mybatis批量插入mysql性能优化_MyBatis-spring和spring JDBC批量插入Mysql的效率比较

工具框架用spring-batch,数据库是mysql(未做特殊优化)。

比较数据框架mybatis和spring jdbc的插入效率。

Mybatis三种实现:

1、mybatis的官方写法

Java代码 a0944a039916d64701a72b660b737075.png

publicvoidbatchInsert1(List poilist)throwsException {

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定义:

Java代码 a0944a039916d64701a72b660b737075.png

publicinterfacePoiMapper {

@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}) ")

publicvoidinsertPoi(Poi poi);

}

2、利用mysql特性,拼写insert sql。

Java代码 a0944a039916d64701a72b660b737075.png

publicvoidbatchInsert2(List poilist)throwsException {

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,定义如下:

Xml代码 a0944a039916d64701a72b660b737075.png

insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values

(#{poi.tag}, GeomFromText(#{poi.point}), #{poi.poiid}, #{poi.meshid}, #{poi.owner}, #{poi.featcode}, #{poi.sortcode}, #{poi.namec}, #{poi.namee}, #{poi.namep}, #{poi.names})

3、利用spring的事务,直接执行插入操作。

Java代码 a0944a039916d64701a72b660b737075.png

@Transactional("dbTransaction")

publicvoidbatchInsert3(List poilist)throwsException {

for(Poi poi : poilist) {

apmapper.insertPoi(poi);

}

}

apmapper是PoiMapper的实例,用@Autowired配置。

Spring-JDBC的三种实现:

A、用spring事务执行插入操作

Java代码 a0944a039916d64701a72b660b737075.png

@Transactional("dbTransaction")

publicvoidbatchInsertJDBC1(List poilist)throwsDataAccessException {

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

Java代码 a0944a039916d64701a72b660b737075.png

@Transactional("dbTransaction")

publicvoidbatchInsertJDBC2(List poilist)throwsDataAccessException {

String sql = "insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values (?, GeomFromText(?), ?, ?, ?, ?, ?, ?, ?, ?, ?)";

List batchArgs = newArrayList();

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。

Java代码 a0944a039916d64701a72b660b737075.png

@Transactional("dbTransaction")

publicvoidbatchInsertJDBC3(List poilist)throwsDataAccessException {

StringBuffer sqlbuf = newStringBuffer()

.append("insert into tb_poi (tag, poi, poiid, meshid, owner, featcode, sortcode, namec, namee, namep, names) values ");

MessageFormat form = newMessageFormat("(''{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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值