前提:
TiDB数据库 分页读取数据时,若两条数据排序字段相同的话,在分页时会有bug找不到其中一条。例如:
id | 语文 | 数学 | 总成绩 |
1 | 60 | 70 | 130 |
2 | 70 | 80 | 150 |
3 | 75 | 75 | 150 |
按照总成绩排序,2和3出现的顺序是随机的。如果恰好两条数据在不同页,在TiDB数据库中分页时,会永远有一条数据查不出来;同理导出时,会有一条数据重复出来两次。可以通过两个字段来控制分页查询。但本文是想通过流的方式一次导出十几万条数据。
流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用。
1、mapper层
void getProgramId(@Param("engineTransaction")EngineTransaction engineTransaction, ResultHandler<EngineTransaction> handler);
2、xml文件
添加两个参数
resultSetType="FORWARD_ONLY" fetchSize="-2147483648"
<select id="getProgramId" parameterType="org.springblade.engine.integral.entity.EngineTransaction" resultType="org.springblade.engine.integral.entity.EngineTransaction"
resultSetType="FORWARD_ONLY" fetchSize="-2147483648">
select id,program_id from t_transaction where is_deleted = 0;
</select>
3、service层
tranAccrualsMapper.getProgramId(new ResultHandler<EngineTransaction>() {
@Override
public void handleResult(ResultContext<? extends EngineTransaction> resultContext) {
/**回调处理逻辑 */
EngineTransaction resultObject = resultContext.getResultObject();
}
});