很多情况下,在工作中需要进行表单迁移,在没有迁移软件的前提下,应该如何进行操作呢?
第一种思路可以通过命令行将表单文件导出再导入,但是表单文件足够大的情况下,导出和导入是非常麻烦的。
在此提供一个纯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