您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

bubuko 2022/1/25 19:58:57 mysql 字数 2162 阅读 644 来源 http://www.bubuko.com/infolist-5-1.html

转自:https://blog.csdn.net/seven_3306/article/details/9303879 在处理mysql数据同步到es上时遇到的问题和解决方案: 最初在使用的是JPA数据连接处理,先分页查询出数据,然后在转成ES需要的数据格式 这里用的是最low的JSON转换 JSO ...

转自:https://blog.csdn.net/seven_3306/article/details/9303879

 

在处理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 = new ArrayList(); while (resultSet.next()) {   UserEs userEs = new UserEs(); userEs .setId(resultSet.getInt("id")); rs.add(anchorEs); if(rs.size()>=50000){   es.saveAll(rs); rs = new ArrayList(); } }

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

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

原文:https://www.cnblogs.com/yongan140621/p/12667986.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶