由于项目需求需要有导入功能,其中需要批量插入数据到数据库当中,基于此原因考虑程序的性能和响应的速度,考虑使用mybaits的批量插入功能实现。由于项目为springmvc4.2+mybatis3.4+mysql5的开发环境进行开发。
批量导入的核心主要是mapping当中xml的文件:
<insertid="insertAll"parameterType="java.util.List">
<!-- 批量插入返回插入的条数 -->
<selectKeyresultType="java.lang.Integer"keyProperty="id"
order= "AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert into keyword_rank (id, send_Date,keyword,
extension_unit, extension_plan,show_quantity,
click_quantity, consume_quantity,click_rate,
click_average_price, account,web_page_conversion,
merchant_bridge_conversion,telephone_conversion,
average_order, type)
values
<foreachcollection="list"item="keywordRank"index="index"separator=",">
(
#{keywordRank.id,jdbcType=VARCHAR},
#{keywordRank.sendDate,jdbcType=TIMESTAMP},
#{keywordRank.keyword,jdbcType=VARCHAR},
#{keywordRank.extensionUnit,jdbcType=VARCHAR},
#{keywordRank.extensionPlan,jdbcType=VARCHAR},
#{keywordRank.showQuantity,jdbcType=DECIMAL},
#{keywordRank.clickQuantity,jdbcType=DECIMAL},
#{keywordRank.consumeQuantity,jdbcType=DECIMAL},
#{keywordRank.clickRate},
#{keywordRank.clickAveragePrice,jdbcType=DECIMAL},
#{keywordRank.account,jdbcType=VARCHAR},
#{keywordRank.webPageConversion,jdbcType=DECIMAL},
#{keywordRank.merchantBridgeConversion,jdbcType=DECIMAL},
#{keywordRank.telephoneConversion,jdbcType=DECIMAL},
#{keywordRank.averageOrder,jdbcType=DECIMAL},
#{keywordRank.type,jdbcType=VARCHAR}
)
</foreach>
对应的到接口如下:
/**
* 批量插入功能
* @param list
* @return
*/
public int insertAll(List<KeywordRankEntity>list);
service层的是引用:
/**
* 批量插入
* @param record
* @return
*/
@Transactional(readOnly=false)
public int keywordRankInserts(List<KeywordRankEntity> list){
// //主要是防止大量数据库插入超时链接导致数据插入失败
// int sumCount = 0;
// for(int i = 0 ; i < (list.size()/10000) +1 ;i++){
// if(list.size() % 10000 == 0 || i < list.size()/10000){
// List<KeywordRankEntity> list1 =list.subList(i*10000, (i+1)*10000);
// sumCount += keywordRankDao.insertAll(list1);
// }else if(list.size() % 10000 != 0){
// List<KeywordRankEntity> list1 =list.subList(i*10000, list.size());
// sumCount += keywordRankDao.insertAll(list1);
// }
// }
// return sumCount;
returnkeywordRankDao.insertAll(list);
}
由于本项目当中的导入数据量非常小没必要实现分批插入的情况,因此直接插入数据便会达到最优化的情况,测试插入8900条情况和时间消耗如下:
timeis : 18770.0 单个插入的总时间;
time is : 18900.0 单个插入第二次整体插入;
time1 is : 16620.0 空表导入批量插入时间10000
time1 is : 4815.0 表中已经存在数据第二次导入
time1 is : 7344.0 空表导入批量插入时间所有的批量一起
time1 is : 6785.0 表中已经存在数据第二次导入
time1 is : 9088.0 空表导入批量插入时间:氛围2000条分批插入
time1 is : 8988.0 表中已经存在数据第二次导入
综上分析当数据量比较大的时候建议分条数插入这样可以防止数据连接插入超时导致插入失败的情况。有此次导入测试批量插入可以看出使用批量插入和单个逐条插入明显看到时间减半,在适当的时候使用批量插入可减少链接数据库的连接数同样可以减少不必要的运算开销,从而大大提高了程序的性能。
如有错误希望可以帮忙纠正错误。