查询并保存大批量数据怎么办?——分页查询、批量插入、多线程和数据分片共同应用以提效

大家开发中会遇到这样一种场景,从某个数据库中查出大量的数据,对这些数据进行某种处理后,存储到另一个数据库中。如果只是简简单单的“流水账”代码,就会耗时很久。这时候就需要采用一些方法来提升效率。

处理大量数据时,为了提高效率,一般可以采取以下几个步骤:

  1. 分批处理:将大数据集分成较小的数据块,每次只处理一部分数据,这样可以减少内存压力,并且可以利用多线程或多进程来加速处理过程。

  2. 使用连接池:通过连接池管理数据库连接,避免频繁地创建和关闭连接,从而节省资源和时间。

  3. 使用索引:确保查询表的关键字段有合适的索引,这有助于加快查询速度。

  4. 缓存结果:如果可能的话,尝试将查询结果缓存起来,以便下次查询时直接返回缓存结果,避免重复查询。

  5. 优化SQL语句:尽可能使用高效的SQL语句,比如避免使用子查询,尽量使用JOIN操作等。

  6. 使用存储过程:如果数据库支持,可以考虑使用存储过程来执行复杂的查询和处理逻辑,因为存储过程在执行时会被预编译,所以可以提高性能。

  7. 使用流式处理:如果数据量非常大,可以考虑使用流式处理技术,比如Apache Flink或Apache Spark,这些工具可以有效地处理无限序列的数据流。

  8. 使用异步任务:对于耗时的操作,比如文件读取或网络请求,可以使用异步任务来避免阻塞主线程,提高整体响应速度。

  9. 监控系统资源:实时监控CPU、内存、磁盘空间等系统资源的使用情况,及时调整资源分配策略,保证系统的稳定运行。

  10. 定期维护数据库:定期清理无用数据,优化数据库结构,更新索引等,以确保数据库始终处于最佳状态。

  11. 批量插入数据: 考虑使用数据库的批量插入功能,如批量插入多行数据,以减少数据库交互次数。

以上就是一些常见的提升大数据处理效率的方法,具体实施时应根据实际情况选择合适的技术手段。

示例:

下面是其中一种提效的方法示例。以将从student_info_data数据库中获取的学生信息进行加工处理,存储到另一个数据库student_info_handled_data中。代码中使用了分页查询、批量插入、多线程和数据分片等多种方法进行效率的提升。

    public Boolean queryStudentInfo4Save() {long start = System.currentTimeMillis();log.info("开始处理,start={}");//从第0条开始,每次查询5000条int PAGE_SIZE = 5000;int offSet = 0;StudentInfoQueryParam studentInfoQueryParam = new StudentInfoQueryParam();studentInfoQueryParam.setPageSize(PAGE_SIZE);while (true) {studentInfoQueryParam.setOffSet(offSet);//批量查询学生信息List<StudentInfo> studentInfoList = this.listStudentInfo(studentInfoQueryParam);//未查到则终止循环if (CollectionUtils.isEmpty(studentInfoList)) {break;}// 收集做处理后的学生信息List<StudentInfo> allList = Collections.synchronizedList(new ArrayList<>());try {// 按一页500条数据进行分片List<List<StudentInfo>> partList = Lists.partition(studentInfoList, 50);//使用多线程CountDownLatch countDownLatch = new CountDownLatch(partList.size());// 一次保存100条数据partList.forEach(pageList -> {executor.execute(() -> {try {// 处理加工学生信息List<StudentInfo> StudentInfoHandledList = handleStudentInfoList(pageList);if (CollectionUtils.isNotEmpty(StudentInfoHandledList)){allList.addAll(StudentInfoHandledList);}}catch (Exception e){log.error("处理学生信息异常", e);}finally {countDownLatch.countDown();}});});countDownLatch.await();} catch (InterruptedException e) {log.error("多线程处理学生信息异常,当前执行情况:{}", e);return null;}if (CollectionUtils.isNotEmpty(allList)){//批量插入处理后的学生信息studentInfoHandledMapper.batchInsert(allList);}//如果最后一次查询查询学生信息小于设置的每页数据,则代表已经查询完毕,终止循环if (studentInfoList.size() < PAGE_SIZE) {log.info("最后一次查询查询学生信息小于设置的每页数据量);break;}offSet += PAGE_SIZE;}log.info("l处理结束,耗时={}",System.currentTimeMillis() - start);return Boolean.TRUE;}public List<StudentInfo> listStudentInfo(StudentInfoQueryParam studentInfoQueryParam) {List<StudentInfo> list = studentMapper.listStudentInfo(studentInfoQueryParam);if (CollectionUtils.isEmpty(list)) {return null;}return list;}

sql伪代码以在springboot中使用mybatis generate自动生成mapper中的自定义方法为例:

分页查询:

<select id="listStudentInfo" parameterType="studentInfoQueryParam"resultType="StudentInfo">SELECT<include refid="Base_Column_List" />FROM student_info_datalimit #{offSet}, #{pageSize}</select>

批量插入:

<insert id="batchInsert" parameterType="StudentInfo">insert student_info_handled_data (id, name, age, class, sex)values<foreach collection ="studentInfoList" item="item" index= "index" separator =",">(#{item.id,jdbcType=BIGINT}, #{item.name,jdbcType=VARCHAR}, #{item.age,jdbcType=INTEGER},#{item.class,jdbcType=VARCHAR}, #{item.sex,jdbcType=INTEGER})</foreach >
</insert>

大家可以使用System.currentTimeMillis()去测试不同方法的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

向openHarmony设备添加perf文件

1. 下载Linux内核源码 先执行apt-cache search命令查询可用的Linux源码包&#xff0c;然后执行apt install命令安装对应的源码包。 sudo apt-cache search linux-source sudo apt install linux-source-xxx 2. 下载交叉编译工具 sudo apt install gcc-arm-linux-gnueabi su…

分库分表之后如何设计主键ID(分布式ID)?

文章目录 1、数据库的自增序列步长方案2、分表键结合自增序列3、UUID4、雪花算法5、redis的incr方案总结 在进行数据库的分库分表操作后&#xff0c;必然要面临的一个问题就是主键id如何生成&#xff0c;一定是需要一个全局的id来支持&#xff0c;所以分库分表之后&#xff0c;…

光纤SAN交换机ZONE的概念

Zone是FC-SAN交换机上的一种独有的逻辑配置&#xff0c;通过配置特定的设备加入zone&#xff0c;从而允许设备之间互相通信。当交换机上配置了zone时&#xff0c;同在一个zone里的设备之间可以互相通信&#xff0c;没有加入任何zone的设备不能与其他设备通信。 早期交换机厂商根…

Stylized Modular Character (Female)(程式化的模块化角色(女性)“运动型”)

一套程式化的角色模块化部件。 在这样的插槽中定制&#xff1a; 头 躯干 手 裤子 靴子 头发 每个插槽都有 2 到 5 个在 URP 中工作的 PBR 材料的选项。 该项目基于官方 Unity Standard Assets 包中的 Ethan 默认角色。 不包含动画。 皮肤网格的 SSS 是由自发光贴图伪造的。 如果…

c++笔记容器和迭代器

C中的迭代器是一个功能强大的工具&#xff0c;用于遍历和操作容器中的元素。深入理解迭代器的类型、特性和用法&#xff0c;以及如何与各类容器配合使用&#xff0c;是编写高效、健壮C代码的关键。下面将深入探讨迭代器的概念、与容器的配合使用、以及注意事项。 迭代器类型 …

怎样查看自己的Windows电脑最近弄了哪些内容

一、需求说明 有时候我们的电脑别人需要使用&#xff0c;你不给他使用又不行&#xff0c;且你也不在电脑身边&#xff0c;你只能告诉他自己的电脑密码让他操作&#xff0c;此时你并不不知道他操作了哪些内容。 还有一个种情况是自己不在电脑旁边&#xff0c;且电脑没有锁屏&…

SQL游标的应用场景及使用方法

SQL游标的应用场景及使用方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨SQL中游标的应用场景及使用方法。游标在SQL中是一种重要的数据…

Pytest集成Allure生成测试报告

# 运行并输出报告在Report文件夹下 查看生成的allure报告 1. 生成allure报告&#xff1a;pycharm terminal中输入命令&#xff1a;产生报告文件夹 pytest -s --alluredir../report 2. pycharm terminal中输入命令&#xff1a;查看生成的allure报告 allure serve ../report …

傻瓜交换机多网段互通组网、设备无法配置网关案例

记录一下&#xff1a; 一、傻瓜交换机多网段互通组网 1、客户在核心交换机上创建了VLAN10&#xff0c;VLAN20。 VLAN10&#xff1a;IP192.168.10.254 VLAN20&#xff1a;IP192.168.20.254 在核心交换机下挂了一台傻瓜交换机&#xff0c;傻瓜交换机接入了一台OA服务器IP&#…

Python基础之IO流和序列化讲解

文章目录 1 IO流1.1 简介1.1.1 定义1.1.2 同步&异步IO 1.2 输入输出1.2.1 输出格式美化1.2.2 str.format()1.2.3 旧式字符串格式化1.2.4 读取键盘输入 1.3 文件操作1.3.1 读和写文件1.3.1.1 open()1.3.1.2 读取其他文件1.3.1.2.1 二进制文件1.3.1.2.2 字符编码 1.3.2 文件对…

【linux/shell实战案例】在shell中插入Python代码及EOF解析

目录 一.什么情况需要在shell中插入Python代码 二.如何在shell中插入Python代码 三.什么是内联输入重定向&#xff1f; 四.什么是EOF 五.为什么要用EOF 六.<<EOF和<<-EOF的区别 七.案例代码 一.什么情况需要在shell中插入Python代码 shell不好处理的数据或…

前端requestAnimationFrame动画

题目:我们来实现一个最简单的需求,将一个元素从屏幕左边均匀地移动到屏幕右边。 一、CSS实现 用 css 实现是最合理也是最高效的,示例代码如下。 @keyframes move_animation1 {0% { left: 0px; }100% { left: calc(100% - 60px); } } @keyframes move_animation {0% { tra…

压缩pdf在线工具,压缩pdf大小的软件

如何有效地压缩PDF文件大小却是个问题&#xff0c;为了获得最佳的压缩效果&#xff0c;我们必须依赖专业的压缩工具&#xff0c;采用错误的方法可能会对文件内容产生负面影响&#xff0c;甚至导致文件无法打开&#xff0c;今天&#xff0c;我将分享一些独特的压缩技巧&#xff…

【leetcode——有效的括号】

最近换实习很久不刷leetcode。。真的有点手生了&#xff0c;还是要坚持刷阿&#xff01; 有效的括号这道题就是实现了一个相互匹配&#xff0c;那么基本上就是用字典&#xff0c;那么如何灵活的用字典&#xff0c;可以使用括号对应数字取加和判断&#xff0c;也可以就单独压入…

如何在Spring Boot中实现OAuth2认证

如何在Spring Boot中实现OAuth2认证 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何在Spring Boot应用中实现OAuth2认证&#x…

HP UX服务器监控指标解读(SSH)

在当今复杂多变的IT环境中&#xff0c;服务器的性能和稳定性是企业运营的关键。HP UX作为一款高性能的Unix服务器操作系统&#xff0c;其监控管理显得尤为重要。监控易作为一款功能强大的监控软件&#xff0c;为HP UX服务器提供了全面的监控解决方案。本文将针对监控易中HP UX服…

在编译 PHP 8.3.8 时遇到 configure: error: Package requirements (libxml-2.0 >= 2.9.0)

configure: error: Package requirements (libxml-2.0 > 2.9.0) were not met: 在编译 PHP 8.3.8 时遇到 configure: error: Package requirements (libxml-2.0 > 2.9.0) were not met 错误时&#xff0c;可能是因为 pkg-config 无法找到 libxml2 的开发文件或路径。以下…

小程序接口报错ERR_CERT_COMMON_NAME_INVALID

收到 ERR_CERT_COMMON_NAME_INVALID 错误&#xff0c;可能是因为使用了不受信任的证书或自签名证书。以下是一些可能的解决方法&#xff1a; 1. 检查域名配置&#xff1a; • 确保 manifest.json 中的合法域名配置正确。 • 确认微信小程序后台也添加了对应的域名。 2. 使用…

C++进阶之哈希

一、unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c;进行…

【python012】Python根据页码处理PDF文件的内容

在日常工作和学习中&#xff0c;需要从PDF文件中提取特定页面的内容&#xff0c;以便进行知识、材料压缩等。 2.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起来&#xff01; 3.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起…