void streamSQL(Connection cnx, String sql) throws SQLException {
cnx.setAutoCommit(false); // TODO: Remember autocommit status here
try (Statement st = cnx.createStatement()) {
st.setFetchSize(10); // TODO: Set buffer size here
try (ResultSet res = st.executeQuery(sql)) {
while (res.next()) {
// TODO: Process row here, e.g. with a callback added as an argument to the method
}
}
} finally {
cnx.setAutoCommit(true); // TODO: Unless it was false earlier
}
}
1条答案
按热度按时间abithluo1#
从@a_horse_with_no_name提供的链接,您应该使用JDBC游标。
你可以用它来处理那些返回巨大结果的查询,比如
streamSQL(cnx, "SELECT * FROM big_table")
,它会让用户感觉运行得很平稳。但是,请注意,如果查询返回的 * 前10条记录 *(10是“缓冲区大小”)需要多次页面扫描,则仍然需要时间。我不知道小缓冲区大小的含义,但这种习惯用法比
LIMIT <n> OFFSET <k*n>
更有效,因为只有 * 一个 * 查询在运行,而不是每页运行一个查询。