使用PostgreSQL JDBC和PostgreSQL数据库时,如何启用流媒体结果集



默认情况下,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>更有效,因为只有一个一个查询,而不是每页一个。

最新更新