大结果集 mysql_mysql大结果集保存到es处理方法

在处理mysql数据同步到es上时遇到的问题和解决方案:

最初在使用的是JPA数据连接处理,先分页查询出数据,然后在转成ES需要的数据格式

这里用的是最low的JSON转换

JSONArray.parseArray(JSON.toJSONString(list),Object.class)

然后在保存到es中,此处的弊端:

1.读取mysql的list缓存在内存中,在通过json转换,太耗内存

2.mysql读取方式使用limit分页,查询效率低下

针对第二点可以优化:(避免使用limit 20000,1000,因为使用limitmysql会扫描前20000后开始往后取1000)

如果id的int或long型,且唯一

查询sql可以通过id排序(这里使用的是正序),第一次取id>0,其后每次的条件都是id>取出最后一个对象的id,然后使用limit 0,1000结尾

但是如果使用mysql的jdbc fetch的流数据接收方式,就可以一次查询亿万条数据,不会在连接上耗费太多时间

PreparedStatement preparedStatement =jdbcTemplate.getDataSource().getConnection().prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);

//这里设置成50000是不生效的

preparedStatement.setFetchSize(Integer.MIN_VALUE);

preparedStatement.setFetchDirection(ResultSet.FETCH_REVERSE);

ResultSet resultSet=preparedStatement.executeQuery();

List rs= newArrayList();while(resultSet.next()) {

UserEs userEs= newUserEs();

userEs .setId(resultSet.getInt("id"));

rs.add(anchorEs);if(rs.size()>=50000){

es.saveAll(rs);

rs= newArrayList();

}

}

最后这个方法就规避了mysql查询出来数据与es存储对象转换的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值