如何在使用PostgreSQL JDBC和PostgreSQL数据库时启用流式结果集

9rnv2umw  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(232)

默认情况下,PostgreSQL JDBC将所有记录读入内存,然后开始处理它们。
如果是MySQL JDBC和MySQL数据库,我知道如何同时进行阅读和处理,但是我不知道如何在PostgreSQL JDBC和PostgreSQL数据库中进行读取和处理。

abithluo

abithluo1#

从@a_horse_with_no_name提供的链接,您应该使用JDBC游标。

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>更有效,因为只有 * 一个 * 查询在运行,而不是每页运行一个查询。

相关问题