HasorDB 流式讀取超大表

2021-12-30 11:25 更新

當(dāng)查詢一張超大表并獲取它的結(jié)果集時(shí)要使用 ?流式返回 ?,否則內(nèi)存極易出現(xiàn)溢出。 不同的數(shù)據(jù)庫(kù)開啟流式返回的方式雖有差異,但都需要設(shè)置 ?Statement/PreparedStatement ?的參數(shù)。

下面就以 MySQL 為例展示一下通過定制 ?Statement ?實(shí)現(xiàn)流式查詢的例子:

// 定制 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);

// 流式消費(fèi)數(shù)據(jù)
RowCallbackHandler handler = (rs, rowNum) -> {
    TestUser dto = rowMapper.mapRow(rs, rowNum);
    ...
};

// 執(zhí)行查詢并流式處理
jdbcTemplate.query(creator, new RowCallbackHandlerResultSetExtractor(handler));


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)