默认情况下,postgresql jdbc将所有记录读取到矩务中,然后开始处理它们。
如果是MySQL JDBC和MySQL数据库,我知道如何同时进行阅读和处理。但是,我不知道该如何在PostgreSQL JDBC和PostgreSQL数据库中进行。
来自@a_horse_with_no_name给出的链接,您应该使用JDBC Cursors。
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
}
}
您可以将其与可以返回巨大结果的查询一起使用,例如 streamSQL(cnx, "SELECT * FROM big_table")
,感觉就像是顺利运行(对用户(。
但是,请注意,如果前10个记录(10是"缓冲区大小",查询返回的"缓冲区大小"需要许多页面扫描,则仍然需要时间。我不知道对较小的缓冲区大小的含义,但是这个习惯比LIMIT <n> OFFSET <k*n>
更有效,因为只有一个一个查询,而不是每页一个。