首页 > 系统相关 >大表迁移,内存不够,如何用纯代码实现?

大表迁移,内存不够,如何用纯代码实现?

时间:2024-05-30 17:34:19浏览次数:27  
标签:VARCHAR batchSize list 表单 item 内存 jdbcType 大表 用纯

很多情况下,在工作中需要进行表单迁移,在没有迁移软件的前提下,应该如何进行操作呢?

第一种思路可以通过命令行将表单文件导出再导入,但是表单文件足够大的情况下,导出和导入是非常麻烦的。

在此提供一个纯java代码的简单思路。

通常情况我们查询一个较大的表单需要花费很长的时间,并且内存可能不支持我们暂存过多的对象,这时候我们只需根据id或者其他递增字段,并创建好相应的索引,通过offset偏移量进行分页查询进行查询,再插入新表单即可,这样可以大大加快表单迁移的效率,还可以通过服务器的性能调整每页查询数据量。

代码如下:

        int batchNumber = 0;
        int batchSize = 1000;

        while (true) {

            List<MdTradeData> list;

            int index = batchNumber*batchSize;

            list = tableTransmitMapper.getBatchData(batchSize,index);

            System.out.println("list:"+list);

            tableTransmitInsertMapper.tableTransmitInsert(list);

            if(list.size()>0){
                batchNumber++;
            }else {
                break;
            }

查询过程

<select id="getBatchData" resultType="com.cy.dataget.entity.MdTradeData">
        SELECT *
        FROM md_trade_data
        ORDER BY id
        LIMIT #{batchSize}
        OFFSET #{index}
    </select>

插入过程:

<insert id="tableTransmitInsert">
        INSERT INTO md_trade_data
        (
        id,
        ex_code,
        trade_date,
        contract_code,
        variety,
        broker_name,
        vol_order,
        volumn,
        volumn_inc,
        vol_type
        ) values
        <foreach collection="list" item="item" separator=",">
            (
            #{item.id,jdbcType=INTEGER},
            #{item.exCode,jdbcType=VARCHAR},
            #{item.tradeDate,jdbcType=VARCHAR},
            #{item.contractCode,jdbcType=VARCHAR},
            #{item.variety,jdbcType=VARCHAR},
            #{item.brokerName,jdbcType=VARCHAR},
            #{item.volOrder,jdbcType=INTEGER},
            #{item.volumn,jdbcType=INTEGER},
            #{item.volumnInc,jdbcType=INTEGER},
            #{item.volType,jdbcType=VARCHAR}
            )
        </foreach>
    </insert>

最终,200w条数据的表单就成功迁移到了新的数据库中。

标签:VARCHAR,batchSize,list,表单,item,内存,jdbcType,大表,用纯
From: https://blog.csdn.net/weixin_43149534/article/details/139271281

相关文章

  • 服务器内存不足该怎么办?
    当服务器的物理内存使用率达到或者是接近百分之百时,会导致系统没有办法为新的进程或者是请求分配足够的内存空间,在这种情况下,服务器的性能很有可能会受到一定的影响,严重的会导致系统崩溃或者服务出现中断。那我们面临服务器内存不足时应该怎么办呢?首先服务器内存已满的情况......
  • 服务器内存不足的原因
    随着服务器的使用越来越广泛,大多数的企业都离不开服务器这一设备,服务器能够通过网络为多个用户提供计算、数据和游戏等多种应用服务,是一种高性能的商用计算机,能够存储和处理网络上大部分的数据信息,但随着时间的推移,服务器中的内存会变得不能够满足业务的需求,出现内存不足的情况......
  • 在 Python 中转换为 np.array 时的内存饱和与内核重启
    在将处理过的数据转换为numpy数组时,我遇到了内存问题。我有57GB内存,但内存很快就饱和了,内核会在np.array(processed_X)处重启。以下是我的代码:importnumpyasnp导入scipy.signalfromskimage.transformimportresizefromtqdmimporttqdmdefapply_stft(signal,n......
  • 【C语言进阶】--- 数据在内存中的存储方式
    整型的存储方式整型的分类整型大致分为:char、short、intchar:字符型,占1个字节的空间short:短整型,占2个字节的空间int:整型,占4个字节的空间存储方式这里声明,借用我在讲【C语言】—操作符中的部分内容整数的二进制表示形式:原码、反码、补码正整数的原码、反码、补码......
  • 数据在内存中存储
    目录1.整数在内存中的存储 2.⼤⼩端字节序3.浮点数在内存中的存储浮点数概念例题 浮点数存储4.浮点数补充说明浮点数取的过程解释例题1.整数在内存中的存储   整数在二进制中表示方法有:原码、反码、补码。对于正整数 以“1”为例原、反、补码......
  • TEE 严重内存泄漏事件
    一次压测循环播放几个APK里面DRM视频1小时后会发生失败,现象是TA没有load成功出错log如下[2276.030861][TEE]D/TC:?00tee_ta_init_session_with_context:583Re-openTA37eb0e02-c43d-48a8-a129-a95dd3d43929[2276.030864][TEE]E/TC:100print_oom:200Memoryalloc......
  • 逆向 | Win7扫雷x64版本内存雷区读取
    逆向|Win7扫雷x64版本内存雷区读取继续写书,这是我为书中实验编写的测试代码。#include<windows.h>#include<stdio.h>#include<tlhelp32.h>#include<string.h>intmain(){ //获取pid HWNDhWnd=FindWindow(NULL,L"扫雷"); DWORDpid=NULL; GetWindowThr......
  • 深入探索C语言动态内存分配
    在编程的广阔天地里,C语言以其直接操控底层的能力和高效性能,至今仍占据着不可替代的地位。而在C语言的众多特性中,动态内存分配无疑是一项核心而又充满挑战的技术。本文将引领您深入探索这一技术的奥秘,从理论到实践,揭示动态内存分配的魅力所在。一、动态内存分配的必要性在程序......
  • 安装centos开机出现Kernel panic - not syncing: Attempted to kill init无法启动解决
    一、安装centos开机出现Kernelpanic-notsyncing:Attemptedtokillinit无法启动的解决方法  装系统总会遇到各种新鲜问题,不过不要紧,只问题才能提升解决问题的能力,今天重新装了个CENTOS6.5的64位版,可能是进行了分区(boot单独挂载到了一个分区),开机时centos报错:Kernelp......
  • 3个进程实现共享内存、信号量、互斥访问
    V1.02024年5月28日发布于博客园题目设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互......