codecamp

HasorDB 流式读取超大表

当查询一张超大表并获取它的结果集时要使用 ​流式返回 ​,否则内存极易出现溢出。 不同的数据库开启流式返回的方式虽有差异,但都需要设置 ​Statement/PreparedStatement ​的参数。

下面就以 MySQL 为例展示一下通过定制 ​Statement ​实现流式查询的例子:

// 定制 PreparedStatement
PreparedStatementCreator creator = con -> {
    PreparedStatement ps = con.prepareStatement(
        "select * from test_user",
        ResultSet.TYPE_FORWARD_ONLY,
        ResultSet.CONCUR_READ_ONLY
    );
    ps.setFetchSize(Integer.MIN_VALUE);
    return ps;
};

// 行读取工具
MappingRowMapper<TestUser> rowMapper = new MappingRowMapper<>(TestUser.class);

// 流式消费数据
RowCallbackHandler handler = (rs, rowNum) -> {
    TestUser dto = rowMapper.mapRow(rs, rowNum);
    ...
};

// 执行查询并流式处理
jdbcTemplate.query(creator, new RowCallbackHandlerResultSetExtractor(handler));


HasorDB ResultSetExtractor(结果集处理)
HasorDB SqlParameterSource(使用接口形式给动态SQL传参)
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }