在处理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.setFetch