首页 > 其他分享 >MyBatis批量插入,分批次批量插入

MyBatis批量插入,分批次批量插入

时间:2023-08-03 09:11:31浏览次数:35  
标签:批量 批处理 数据库 插入 等待时间 内存 MyBatis 占用

/**
* 分批次批量插入
* @throws IOException
*/
@Test
public void testBatchInsertUser() throws IOException {
    InputStream resourceAsStream =
        Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession session = sqlSessionFactory.openSession();
    System.out.println("===== 开始插入数据 =====");
    long startTime = System.currentTimeMillis();
    int waitTime = 10;
    try {
        List<User> userList = new ArrayList<>();
        for (int i = 1; i <= 300000; i++) {
            User user = new User();
            user.setId(i);
            user.setUsername("共饮一杯无 " + i);
            user.setAge((int) (Math.random() * 100));
            userList.add(user);
            if (i % 1000 == 0) {
                session.insert("batchInsertUser", userList);
                // 每 1000 条数据提交一次事务
                session.commit();
                userList.clear();

                // 等待一段时间
                Thread.sleep(waitTime * 1000);
            }
        }
        // 最后插入剩余的数据
        if(!CollectionUtils.isEmpty(userList)) {
            session.insert("batchInsertUser", userList);
            session.commit();
        }

        long spendTime = System.currentTimeMillis()-startTime;
        System.out.println("成功插入 30 万条数据,耗时:"+spendTime+"毫秒");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        session.close();
    }
}

使用了 MyBatis 的批处理操作,将每 1000 条数据放在一个批次中插入,能够较为有效地提高插入速度。同时请注意在循环插入时要带有合适的等待时间和批处理大小,以防止出现内存占用过高等问题。此外,还需要在配置文件中设置合理的连接池和数据库的参数,以获得更好的性能。

 

总结

实现高效的大量数据插入需要结合以下优化策略(建议综合使用):

批处理

批量提交SQL语句可以降低网络传输和处理开销,减少与数据库交互的次数。在Java中可以使用Statement或者PreparedStatement的addBatch()方法来添加多个SQL语句,然后一次性执行executeBatch()方法提交批处理的SQL语句。

  • 在循环插入时带有适当的等待时间和批处理大小,从而避免内存占用过高等问题:

    • 设置适当的批处理大小:批处理大小指在一次插入操作中插入多少行数据。如果批处理大小太小,插入操作的频率将很高,而如果批处理大小太大,可能会导致内存占用过高。通常,建议将批处理大小设置为1000-5000行,这将减少插入操作的频率并降低内存占用。
    • 采用适当的等待时间:等待时间指在批处理操作之间等待的时间量。等待时间过短可能会导致内存占用过高,而等待时间过长则可能会延迟插入操作的速度。通常,建议将等待时间设置为几秒钟到几十秒钟之间,这将使操作变得平滑且避免出现内存占用过高等问题。
    • 可以考虑使用一些内存优化的技巧,例如使用内存数据库或使用游标方式插入数据,以减少内存占用。
  • 总的来说,选择适当的批处理大小和等待时间可以帮助您平稳地进行插入操作,避免出现内存占用过高等问题。

索引

在大量数据插入前暂时去掉索引,最后再打上,这样可以大大减少写入时候的更新索引的时间。

数据库连接池

用数据库连接池可以减少数据库连接建立和关闭的开销,提高性能。在没有使用数据库连接池的情况,记得在finally中关闭相关连接。

数据库参数调整

增加MySQL数据库缓冲区大小、配置高性能的磁盘和I/O等。

标签:批量,批处理,数据库,插入,等待时间,内存,MyBatis,占用
From: https://www.cnblogs.com/privateLogs/p/17602370.html

相关文章

  • 算法-09-插入排序
       ......
  • SPSS批量删除含有缺失值的个案
     1.对于上面数据中的ba002_1变量,先点击数据,然后选择选择个案  2.选择如果条件满足,然后选择缺失值函数Sysmis,Sysmis函数的用法如下:SYSMIS(numvar)逻辑。如果numvar的值为系统缺失值,则返回1或true。参数numvar必须为工作数据文件中某个数值变量的名称。这里我们如果......
  • 16.map插入方式有哪几种?
    16.map插入方式有哪几种?1.用insert函数插入pair数据mapStudent.insert(pair<int,string>(1,"student_one"));2.用insert函数插入value_type数据mapStudent.insert(map<int,string>::value_type(1,"student_one"));3.在insert函数中使用make_pair()函数mapStu......
  • mybatisplus 查询结果排除某字段实现
    数据有Test表,表里有id,name,ip_address,last_time四个字段通常查询写法,返回结果会把id,name,ip_address,last_time四个字段都返回publicListselectList(Testtest){Listlist=testMapper.selectList(newQueryWrapper<>(test))returnlist;}现在想排......
  • 如何插入视频?
    要发布公众号只能选择前两者一、添加腾讯视频步骤组件-视频填写嵌入代码,登录腾讯视频网页版,如果是自己的视频,先上传到腾讯视频,再打开实现效果选择开启增强模式存在的问题:有广告,目前不能自己上传视频(可以通过短视频的角度发)二、导入公众号视频选择组件......
  • Xenserver批量运维脚本
    可实现如下功能:你正在运行Xenserver脚本程序,有如下功能可选择1显示当前系统虚拟机列表2批量添加虚拟机磁盘3批量设置防鼠标漂移4虚拟机异常卡死处理5虚拟机后缀占位符设置,默认VDI-001占位符3若VDI-01占位符26功能说明手册0退出程序运行#!/bin/bashpdd=3#虚拟机后缀占......
  • Sqlalchemy框架连接达梦数据库插入数据无法保存
    问题点:用户使用Sqlalchemy框架插入数据,无法保存数据代码报错复现信息如下:ValueError:invalidliteralforint()withbase10: 排查思路:确认插入的数据,是否符合表字段定义的数据类型排除法测试每个字段的插入情况创建模拟表结构,插入数据Python代码创建测试表1创......
  • Java编程-目录整理、新建接口、集成mybatis plus以及数据库初始化
    数据库初始化新建对应调试库```#dockerps#dockerexec-it6d542566d077/bin/bashpostgres=#createdatabasenovel;```执行全量脚本......
  • 请求示例curl获取淘宝1688京东等电商平台商品详情数据API接口,批量采集
    获得页面使用命令:curlhttp://curl.haxx.se这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将只显示文件头部,即HTML文档的header。要全部显示,请加参数......
  • Python超实用!批量重命名文件/文件夹,只需1行代码
    大家好,这里是程序员晚枫,之前在小破站给大家分享了一个视频:批量重命名文件。最近在程序员晚枫的读者群里,发现很多朋友对这个功能很感兴趣,尤其是对下一步的优化:批量重命名文件夹。这周我利用下班时间,把这个功能改进了一下,增加了几个可选的功能,我们一起来看一下吧~批量重命名文件......