大量数据批量插入数据库

大量数据批量插入数据库


前言

工作时遇到了大量数据需要插入到数据库的情况,一条条的插入速度慢效率低下,不能满足需求,为了解决此问题采用了sql中使用foreach,并在service中设置批量来进行批量插入。此外查找资料时发现还有一种batch方法,但是自己没能实现,希望有大佬可以指点我一下。。


一、在oracle中使用foreach语句的一些注意事项

1、不能使用values语句:最开始使用了 insert into table_name (xxx,xxx,xxx) values 《foreach》 (xxx,xxx,xxx) 《/foreach》
发现oracle报错,从网上查找资料发现oracle中不能使用values,所以暂时放弃了values的写法;
2、《foreach》 标签中的separator的属性为"UNION ALL",将查询合并结果集。
3、oracle没有主键自增,需要将useGeneratedKeys属性设置为false
4、需要使用selece … from dual 虚拟表来过渡

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、oracle中foreach代码

了解到上述注意事项,就可以写响应的sql语句(mapper.xml),具体代码如下(id字段通过 sys_guid()函数自动插入):

 <insert id="batchSave" parameterType="com.gettop.bi.web.model.BiFinanceFeePersonDetail" useGeneratedKeys="false">
    insert into BI_FINANCE_FEE_PERSON_DETAIL (ID, VERSION_CODE, PROPERTY_CODE,
    DEPARTMENT_BIG_SORT, DEPARTMENT_MOTIVATE_SORT,
    DEPARTMENT_SORT, BUDGET_ENTITY, PROJECT_CODE,
    SBU_CODE, RANK_SORT, YEAR_MONTH,
    PERSON_MONTH, MANPOWER_TOTAL, IYEAR
    )
    <foreach collection="lists" item="list" index="index" separator="union all">
      SELECT
      sys_guid(),
      #{list.versionCode,jdbcType=VARCHAR}, #{list.propertyCode,jdbcType=OTHER},
      #{list.departmentBigSort,jdbcType=VARCHAR}, #{list.departmentMotivateSort,jdbcType=VARCHAR},
      #{list.departmentSort,jdbcType=VARCHAR}, #{list.budgetEntity,jdbcType=VARCHAR}, #{list.projectCode,jdbcType=VARCHAR},
      #{list.sbuCode,jdbcType=VARCHAR}, #{list.rankSort,jdbcType=VARCHAR}, #{list.yearMonth,jdbcType=VARCHAR},
      #{list.personMonth,jdbcType=DECIMAL}, #{list.manpowerTotal,jdbcType=DECIMAL}, #{list.iyear,jdbcType=VARCHAR}
      FROM dual
    </foreach>
  </insert>

三、设置插入的批次

通过下述代码显现批量插入数据,具体代码如下(nums为每次插入的条数,times时插入的此时):

               int nums = 1000;
                int times = (int)Math.ceil((float)list.size() / nums);// 插入次数
                try {
                    for (int i = 0; i < times; i++){
                        if(i == times - 1){
                            biFinanceFeeDetailMapper.batchSave(list.subList(i * nums, list.size()));
                            resuleMap.put("status",1);
                        }else {
                            biFinanceFeeDetailMapper.batchSave(list.subList(i * nums, (i+1) * nums));
                            resuleMap.put("status",1);
                        }
                    }
                } catch (Exception e) {

                    e.printStackTrace();
                }

总结

通过查找资料和各种踩oracle的坑终于实现了批量插入,其实速度还是不快,经测试插入5w条数据仍耗费10s,如果哪位大佬有更高效好用的方法,希望可以指导我一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值