Mybatis流式查询
1.Mapper层的处理
/**
* 流式查询
*
* @param sql sql
* @param fieldMap fieldMap
* @param handler handler
*/
@SelectProvider(type = SqlProvider.class, method = "buildSql")
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)
@ResultType(JSONObject.class)
void streamQuery(@Param("sql") String sql, @Param("param") Map<String, Object> fieldMap, ResultHandler<JSONObject> handler);
这里注意一个问题, 只有当 fetchSize = Integer.MIN_VALUE 才会一条一条返回
2.ResultHandler 的处理
List<JSONObject> queryResults = new ArrayList<>((int) excelExportPageSize);
// ResultHandler 是函数式接口
queryService.streamQuery(fieldMap, reportTemplate, resultContext -> {
// 获取到每一条数据
JSONObject result = resultContext.getResultObject();
queryResults.add(result);
// 批量处理
if (queryResults.size() == excelExportPageSize) {
// TODO 业务处理
queryResults.clear();
}
});
// TODO 业务处理
3. sql如何保持长连接
a.对于有事务特性的数据库 我们可以使用 @Transactional(readOnly = true) 来保持长连接
b.对于没有事务特性的数据库,我们需要增加他的query_timeout
比如StarRocks 我们在查询的时候需要在sql 中设置query_timeout , select 后面加 /*+ SET_VAR(query_timeout=500) */