Mybatis流式查询sql超时问题
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) */