Mybatis流式查询sql超时问题

发布时间 2023-12-10 10:25:00作者: 左手程序,右手诗

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) */