java数据迁移,内存溢出

Java实现百万级数据从Excel导入到数据库 在一个后台管理功能中,Excel导入数据是不可缺少,但是当处理大数据量的Excel文件导入时候就可能会带来一些列的问题,本文我们会分析问题产生的原因。并提供解决方案以及完整的实现代码。 阅读详情

最近要将一个老系统的数据迁移到新系统来,当然是将老数据库中的数据放到新数据库中来。
当查询数据的时候出现了jvm内存溢出,这里记录一下

原先的代码,这代码一看就有问题,按时间查询,查询出的东西是放在jvm内存里的,如果时间短,数据少那当然没啥问题,但是如果我一下子要迁移2年的数据,那数据量就非常大,内存就可能溢出了。

 ResultSet select = JdbcHelper.select(con, "SELECT * FROM jc_content_ext cex \n" +
                                "\t\tLEFT JOIN jc_content jcon ON jcon.`content_id` = cex.`content_id`\n" +
                                "                LEFT JOIN jc_content_txt ctx ON cex.`content_id` = ctx.`content_id` \n" +
                                "                LEFT JOIN jc_content_channel jcc ON cex.`content_id` = jcc.`content_id` \n" +
                                "                LEFT JOIN jc_channel jc ON jcc.`channel_id` = jc.`channel_id` \n" +
                                "                LEFT JOIN jc_channel_ext jct ON jct.`channel_id` = jcc.`channel_id`\n" +
                                "                LEFT JOIN jc_user_ext jue ON jue.`user_id` = jcon.`user_id`\n" +
                                "                WHERE 1 = 1 AND  cex.`release_date` BETWEEN '"+TAG_LAST_TIME+"' AND '"+TAG_THIS_TIME+"' AND jcon.`status` = 2 LIMIT " + pageIndex +"," + pageSize
                        );
                        handleResult(select, columnMap, con);

优化:还是分页查询,先查询出时间段内总共的记录数,根据记录数的范围,然后分页查询。
优化后的代码。这里我按500/页来查询:
注意1:这里查询数据总数的时候,还遇见了一些问题。
如果直接count(*),ResultSet 是无法通过列名得到总的数据数。
这时得随便找一个列名,然后起个别名,之后,取总记录数的时候,用该别名才能得到。原因嘛,我们不是用mybatis,也不是在mysql直接查,它是将结果集放在了ResultsSet里,所以我们直接是拿不到数据的,
不起别名的话是这样在这里插入图片描述
。这样就不好拿到数据了。这时的结果集,只有这个,如果起过别名在这里插入图片描述,这时我们就可以直接通过rs.getString(“a”)来得到列明为a的数据了。
当然也可以一次查询出所有数据,然后循环结果集rs。但是如果数据太大,还是会导致内存溢出。
注意2:
在用COUNT(cex.content_id) as a取出数据的时候要,先 rs.next();,再rs.getString(“a”)。才能取到总的记录数。否则会异常。


            ResultSet rs = JdbcHelper.select(con, "SELECT COUNT(cex.content_id) as a FROM jc_content_ext cex \n" +
                    "\t\tLEFT JOIN jc_content jcon ON jcon.`content_id` = cex.`content_id`\n" +
                    "                LEFT JOIN jc_content_txt ctx ON cex.`content_id` = ctx.`content_id` \n" +
                    "                LEFT JOIN jc_content_channel jcc ON cex.`content_id` = jcc.`content_id` \n" +
                    "                LEFT JOIN jc_channel jc ON jcc.`channel_id` = jc.`channel_id` \n" +
                    "                LEFT JOIN jc_channel_ext jct ON jct.`channel_id` = jcc.`channel_id`\n" +
                    "                LEFT JOIN jc_user_ext jue ON jue.`user_id` = jcon.`user_id`\n" +
                    "                WHERE 1 = 1 AND  cex.`release_date` BETWEEN '"+TAG_LAST_TIME+"' AND '"+TAG_THIS_TIME+"' AND jcon.`status` = 2"
            );

            System.out.println("总条数++++++"+ rs.getRow());
            System.out.println("总条数++++++"+ rs);

            rs.next();
            System.out.println(rs.getString("a"));
            int count = Integer.parseInt(rs.getString("a"));
            System.out.println(count);


            if(count > 0 ){
                if(count <= 500 ){
                    System.out.println("小于500 ================== " + count);
                    ResultSet select = JdbcHelper.select(con, "SELECT * FROM jc_content_ext cex \n" +
                            "\t\tLEFT JOIN jc_content jcon ON jcon.`content_id` = cex.`content_id`\n" +
                            "                LEFT JOIN jc_content_txt ctx ON cex.`content_id` = ctx.`content_id` \n" +
                            "                LEFT JOIN jc_content_channel jcc ON cex.`content_id` = jcc.`content_id` \n" +
                            "                LEFT JOIN jc_channel jc ON jcc.`channel_id` = jc.`channel_id` \n" +
                            "                LEFT JOIN jc_channel_ext jct ON jct.`channel_id` = jcc.`channel_id`\n" +
                            "                LEFT JOIN jc_user_ext jue ON jue.`user_id` = jcon.`user_id`\n" +
                            "                WHERE 1 = 1 AND  cex.`release_date` BETWEEN '"+TAG_LAST_TIME+"' AND '"+TAG_THIS_TIME+"' AND jcon.`status` = 2"
                    );
                    handleResult(select, columnMap, con);

                    con.close();
                }else{
               
                    int row = count;
                    int pageCount = row / 500 ;

                    for(int i =0; i<pageCount; i++){
                        int pageIndex = i * 500;
                        int pageSize  = 500 ;
                        ResultSet select = JdbcHelper.select(con, "SELECT * FROM jc_content_ext cex \n" +
                                "\t\tLEFT JOIN jc_content jcon ON jcon.`content_id` = cex.`content_id`\n" +
                                "                LEFT JOIN jc_content_txt ctx ON cex.`content_id` = ctx.`content_id` \n" +
                                "                LEFT JOIN jc_content_channel jcc ON cex.`content_id` = jcc.`content_id` \n" +
                                "                LEFT JOIN jc_channel jc ON jcc.`channel_id` = jc.`channel_id` \n" +
                                "                LEFT JOIN jc_channel_ext jct ON jct.`channel_id` = jcc.`channel_id`\n" +
                                "                LEFT JOIN jc_user_ext jue ON jue.`user_id` = jcon.`user_id`\n" +
                                "                WHERE 1 = 1 AND  cex.`release_date` BETWEEN '"+TAG_LAST_TIME+"' AND '"+TAG_THIS_TIME+"' AND jcon.`status` = 2 LIMIT " + pageIndex +"," + pageSize
                        );
                        handleResult(select, columnMap, con);
                    }
                    con.close();

                }
            }

Elasticsearch基本用法完整指南:批量操作Bulk API实践 深入掌握elasticsearch基本用法,重点解析高效数据写入方式,通过Bulk API实现批量操作,提升索引性能与系统吞吐量,适用于大规模数据场景。 阅读详情

相关推荐

Java实现数据库迁移同步

完整代码,Java高效实现数据库迁移同步

java实现多数据源跨表关联计算内存溢出解决思路

有多个数据源,以下简称数据源A、B、C,来自相同或不同的数据库,现在需要把数据取出,在java中进行计算,常规操作是分别把每个数据源的数据全部查询出来,然后按照关联条件进行关联计算。查询时会出现一个很明显的问题,若这三个sql任意一个数据量很大,很有可能出现内存溢出的问题,因此不能直接查询全部数据,而是需要进行分批查询然后计算。使用第一个数据源(即A)作为计算的主表,根据关联条件去其他数据源过滤得到用于计算的数据。1.首先构造数据源A的查询sql,假设构造后的sql为。数据源B和C的查询sql分别为。

qq_36635569的博客 636

基于LendingClub数据的信贷分析和建模报告

一:课题分析 二:数据获取 三:数据探索 3.1主要特征含义理解 3.2特征分布 3.2.1目标特征分布 3.2.2分类变量的分布 3.2.3连续数值特征分布 3.2.4时序特征分布 3.2.5文字特征分布 3.2.6两两特征的协方差 四:数据预处理 4.1数据集划分 4.2特征缺失值识别与处理 4.2.1严重缺失值的处理 4.2.2缺失值填充 4.3同值性特...

棒子皮蹦蹦床 2万+

线上问题排查之文件导入导出导致内存的溢出如何排查

在Java应用程序中,文件导入导出导致内存溢出(OutOfMemoryError)是一个常见的问题,特别是在处理大文件时。内存溢出通常是由于程序试图在堆内存中加载过多的数据,超过了IM的内存限制。下面提供一个详细的排查和解决过程,以及一个具体的示例。此篇主要还是处理大文件的问题,包括下载大文件时,bytes[]接收太多数据,一样会出现内存溢出,本文使用的逐行处理大文件也分而治之的意思,java处理小文件才不会出现问题。

qq_39126115的博客 1424

ChipCamp探索系列 -- 7A. 开源CPU之BOOM的来龙去脉

本文梳理一下Berkeley的乱序超标量CPU项目----Berkeley Out of Order Machine (BOOM),作为探索7系的首篇(7A)。

ChipCamp的博客---https://chipcamp.blog.youkuaiyun.com/ 1558

[软考]系统架构设计师 备考经验分享(一) - 备考计划篇

前言 上周末刚刚结束了软考架构师的考试,自我感觉考的还可以,大概率是过了。 两次参加软考,一次中级嵌入式,一次高级架构师,都是备考不到两个月时间,尤其是架构师这次考试内容和本职工作有不小的差别,并且需要同时备考三个科目,在高强度地备考中感觉是摸索出到了一点软考的技巧与经验。 打算趁还记得,赶紧写几篇文章做下梳理总结,算是给将来自己考系分、高项或者其他考试做个记录,也希望能够帮到正在备考的大家。 先把第一步,个人的备考计划分享给大家。 自身情况分析 首先,请大家一定先明确三个问题,这三个问题会直接影响到你的

_ 6404

java实现将A表数据转移到B表_解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表(merge into)...

作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表;语法:MERGE INTO [your table-name] [rename your table here]USING ( [write your query here] )[rename your query-sql and using just like a table]ON ([condition...

weixin_34862004的博客 874

十七、SAP-采购订单(STO)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 2065

JavaPOI大数据量Excel导入内存溢出处理方案:高效导入Excel数据,告别内存溢出

JavaPOI大数据量Excel导入内存溢出处理方案:高效导入Excel数据,告别内存溢出 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在当今信息化的时代,Excel已经成为数据处理的重要工具。然而,当面对大量数据时,使用Java POI库进行Excel导入常常会遇到内存溢出的困扰。针对这一问题,我们推出了JavaPOI大数据量Excel导入内存溢出处理方案。该项目...

gitblog_06705的博客 546

【STM32项目】基于STM32设计的震动马达超声波电机高频震动——高级定时器PWM互补输出带死区控制__资料编号3

实现高级定时器互补输出带死区控制,实现震动/超声波电机/马达,高频震动。使用 STM32F103 芯片输出两路互补 PWM,并带有死区和刹车控制功能。定时器 1 通道 1 及其互补通道输出PWM,且带死区控。当定时器 1 的刹车输入引脚被拉高时,产生刹车时间,即定时器 8 停止输出 PWM。当刹车输入引脚被拉高时,通道 1 和通道 2 将从有波形输入状态转换成无效电平状态。

嵌入式阿齐Archie 6738

基于STM32设计的便携式心电信号监测系统_146

基于STM32 设计的便携式心电信号监测系统,采用 PulseSensor 心率传感器进行数据采集,通过 LCD 显示屏显示心电数字数据和采集状态。同时,该系统还采用 HC05 蓝牙模块将实时心电信号数据传输到手机 APP,用户可以在手机 APP 上实时查看采集的数据并绘制心率曲线。此外,STM32 上的按键可以控制心率采集状态,用户登录手机 APP 还可以查看实时心电信号折线图。

1万+

YOLOv11+BiFPN双向特征金字塔:全方位解析多尺度检测性能优化指南

飞书链接:https://ecn6838atsup.feishu.cn/wiki/EhRtwBe1CiqlSEkHGUwc5AP9nQe?购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。函数中添加BiFPN的解析逻辑(找到。链接可用,不要多复制空格了。密码:946m22&8。

FJN110的博客 306

关于使用java代码进行数据抽取的问题

最近因为工作需要 要做这样一个工作,要从一个数据库把里面4张表数据导入另外一个库中 来做报表分析,因为原来的生产环境使用人数比较多为了不影响使用才使用到处部分表的方式来做。 因为这几张表又很多数据就考虑了用java来做定时任务每天抽取前一天产生的数据。这样就需要一开始就把那边的数据全部导入到这边数据。 因为数据量比较大再配置数据源的时候使用了c3p0数据源 [code="java"] ma...

uncle123456的博客 720

C# 上位机程序中的数据采集与存储技术:从采集到持久化的完整解决方案

本文系统讲解C#上位机程序如何实现设备数据采集与持久化。主要内容包括:1)多种数据采集方式(串口通信、Modbus、OPC等)及代码示例;2)详细对比不同存储技术(CSV、SQLite、关系型数据库等)的优缺点;3)提供SQLite等存储实现代码;4)推荐分层系统架构(采集-缓存-存储-可视化);5)性能优化建议(多线程采集、异步存储、批量写入等)。文章强调应根据项目需求选择合适的技术方案,构建高效稳定的数据采集存储闭环系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1025

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java实现CSV导出千万级数据实例:轻松应对大数据量导出挑战

Java实现CSV导出千万级数据实例:轻松应对大数据量导出挑战 【下载地址】Java实现CSV导出千万级数据实例 本项目提供了一个高效的Java工具,专门用于解决导出大规模CSV数据时常见的内存溢出问题。通过优化内存管理和分批处理技术,它能够快速且稳定地导出千万级数据,测试显示1650万条数据仅需约80秒即可完成。该工具...

gitblog_06734的博客 1104

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【亲测免费】 Java CSV大数据量导出解决方案:高效、稳定、可靠

Java CSV大数据量导出解决方案:高效、稳定、可靠 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代数据驱动的应用中,数据导出是常见且重要的功能之一。然而,当面对千万级别的大数据量时,传统的导出方法往往会导致内存溢出,严重影响系统的稳定性和性能。为了解决这一难题,我们推出了Java CSV大数据量导出解决方案。该方案不仅能够高效地处理大规模数据导出,还通过多线...

gitblog_09813的博客 1028

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

mysql大表数据抽取_从云数据迁移服务看MySQL大表抽取模式

摘要:MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来。小编最近在云上的一个迁移项目中被MySQL抽取模式折磨的很惨。一开始爆内存被客户怼,再后来迁移效率低下再被怼。MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来。Java-JDBC通信原理JDBC与数据库之间的通信是通过socket完,大致流程如下图所示。Mysql Server ->内核Soc...

weixin_42361622的博客 257

Springboot+Mysql流式查询——避免内存溢出(OOM)

话说笔者最近在做一个数据迁移的功能,说白了就是数据导出导入嘛。寻思着这还不简单,没想到第一步就GG了。 具体就是在数据库查询返回数据集时,由于数据集过大(大约几十万条吧)导致出现了内存溢出,即后台报错OOM。面对这种问题我们的第一反应肯定是将结果分页返回。但是分页却不得不考虑到几个问题:首先就是每页的大小,需要经过测试来确定一个合适的值,如果页面过大仍然可能出现内存溢出的问题;其次就是对于结果超大的数据集,在分页时偏移性能、查询开销和结果预加载似乎真的会损害分页方法的效率,简而言之就是会比较慢。 经过一翻查

qq_39231899的博客 2776

【YashanDB知识库】kettle同步大表提示java内存溢出

【问题描述】kettle同步大表提示ERROR:could not create the java virtual machine!②优化Kettle转换。检查步骤是否有优化空间,例如通过调整批量大小、优化数据库查询、减少不必要的步骤等。①增加JVM的堆内存大小。【关键字】数据同步,kettle,数据迁移,java内存溢出。【问题原因分析】java内存溢出。【问题分类】数据导入导出。【影响范围】所有版本。

cod0410的博客 529

Android 关于Excel表格的读与写(包括图片、字体颜色,语言)

实现数据备份与数据迁移:1:把数据库里面数据批量生成excel表格:;2:读取Excel表格,批量导入设备。

qq_22985533的博客 1820

OOM 内存溢出 问题 排查

最近工作上正在做数据迁移,数据量不大但是还是遇到了一些问题。         机器配置如下: CPU:   model name      : Intel(R) Xeon(R) CPU           E5410  @ 2.33GHz cpu MHz         : 2333.416         MEM:2G      四个线程,迁移200W数据   TP...

238

hadoop file output 报 java.lang.OutOfMemoryError: Requested array size exceeds VM

 使用kettle将hive中的数据抽取到hdfs中,报 java.lang.OutOfMemoryError: Requested array size exceeds VM  原因是,hive中有两个字段定义的长度为21亿,超过了jvm数据长度,减小这两个字段长度即可。       ...

zsg86的博客 1315

使用java + jdbc连接数据库,并解析成XML格式的文件。。另外有对流文件的操作。。(数据迁移)

说明:迁移别人旧系统数据库数据时,临时用到的,就写了一个java应用程序。很多小细节没有处理,但是可以正常使用。。如果要运行大数据量的话估计要好好认真的处理下文件流的资源关闭,否则小心内存溢出。。。 目录说明: 一、代码 二、配置文件 三、运行方式 四、效果展示 五、注意事项 - jdk版本问题 一、代码 import org.w3c.dom.CDATASec...

Satisfy_555的博客 1076

jpa批量处理大对象,内存溢出的问题

几天前,遇到了一个问题,从发现到解决,耗费了好几天,写一遍博客,记录下经过; 任务描述:将mysql存储的第三方数据,迁移到mongodb; 问题描述:数据迁移过程中,运行到大概1万多条的时候,突然报java.lang.OutOfMemoryError: Java heap space 解决过程:因为第三方数据过大,通讯录记录可以达到几十兆,起初认为,新生成的大对象因为数据过大,无法保存于...

java_s_firend的博客 3910
上一篇: javascript实现粘贴qq截图功能(clipboardData)
下一篇: js编码解码decodeURI()与decodeURIComponent()的区别
java_xxxx
博客等级 码龄9年 127粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值