个人技术分享

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

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

在此提供一个纯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条数据的表单就成功迁移到了新的数据库中。