当一个表有亿级别的数据,我们想不用索引的情况下一次性查出所有数据,
- 一来是速度缓慢。
- 二来是有可能导致超时。
- 三来是将几百万的数据存入集合对象很容易OOM。因为你存入的数据都是强引用,直至OOM之前都不会被GC。
所以这种情况下最好采用流式查询,一次只查询出1000条(自定义),来进行逐步的查询和获取。
@Repository
public interface WjMapper extends BaseMapper {
@Select("${sql}")
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
@ResultType(Map.class)
void dynamicSelectLargeData(@Param("sql") String sql, ResultHandler<Map> handler);
}
@RestController
public class Test {
@Autowired
private WjMapper wjMapper ;
@GetMapping("/ga")
public void getLargeData() {
String sql = "select * from CGF";
wjMapper .dynamicSelectLargeData(sql, new ResultHandler<Map>() {
@Override
public void handleResult(ResultContext<? extends Map> resultContext) {
Map resultObject = resultContext.getResultObject();
System.out.println(resultObject);
}
});
}
}
|