大量数据批量插入数据库

大量数据批量插入数据库


前言

工作时遇到了大量数据需要插入到数据库的情况,一条条的插入速度慢效率低下,不能满足需求,为了解决此问题采用了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,如果哪位大佬有更高效好用的方法,希望可以指导我一下。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将XML文件中的大量数据快速插入数据库可以通过以下几种方法实现: 1. 使用XML解析库:选择一种高效的XML解析库,如XML DOM、SAX或StAX,将XML文件解析成内存中的数据结构。然后,使用数据库批量插入功能,将解析得到的数据一次性插入数据库中,减少插入操作的开销。 2. 使用存储过程:创建一个存储过程,接受XML作为输入参数。存储过程中可使用XML内建函数或OPENXML函数解析XML,并使用循环语句逐条插入数据库。存储过程能够利用数据库的事务机制,确保插入过程的原子性和一致性。 3. 使用批量插入工具:某些数据库提供了专门的批量插入工具,如Oracle的SQL*Loader或SQL Server的BCP工具。将XML文件进行预处理,转换为适合批量插入的格式,然后通过这些工具进行快速插入数据库。 4. 使用数据库的导入功能:某些数据库管理系统提供了导入功能,支持直接将XML文件导入数据库中。可以通过定义数据映射规则或使用XML Schema来指定XML中元素与数据库表之间的对应关系,然后使用数据库的导入功能进行快速插入。 无论采用哪种方法,都需注意处理数据的合法性和一致性,避免因为意外数据格式或错误导致的插入失败或损坏数据库的情况发生。此外,需要根据具体情况选择适合的操作方式,如批量插入、逐条插入或并行插入,以获得最佳的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值