Postgres如何实现JDBC fetch size?

问题描述 投票:0回答:0

我正在开发数据库导入工具。我正在通过设置 JDBC 提取大小从 Postgres 数据库读取数据。请注意,出于测试目的,我已将其设置为

1
。我正在使用这段代码从底层的 Postgres DB 中读取:

    try (final Connection connection = dataSource.getConnection()) {
        final DatabaseMetaData metadata = connection.getMetaData();
        connection.setAutoCommit(false);
        final PreparedStatement statement = connection.prepareStatement("SELECT * FROM \"public\".\"table\" ORDER BY \"cursor\" ASC");
        statement.setFetchSize(1);
        final ResultSet rs = statement.executeQuery();
        final ResultSetMetaData metaData = rs.getMetaData();
        while (rs.next()) {
          processResultSet(rs);
        }
        rs.close();
}

我想了解在具有实时更新的数据库上运行此工具时会发生什么情况。

为此,我在处理结果集时设置了一个断点,并同时更新了新源数据库中的值。我最初的理论是,获取大小是由限制和偏移量的组合强制执行的。我的期望是我的代码会获取对数据库的新更改,因为我正在设置获取大小(导致查询以流模式执行)。我还验证了对

rs.next()
的每次调用都会通过网络从 Postgres 数据库中获取数据。

然而,这个假设是错误的。我发现新值没有在我的简单 JDBC 迭代器中读取。那是因为给定的 SQL 查询是在单个事务中执行的吗?如果是这样,这是如何工作的? Postgres 是否一直跟踪陈旧数据直到事务结束。这是否适用于大型查询,例如

select * from table
?提前感谢帮助 - 试图更好地理解这一点

database postgresql jdbc transactions internals
© www.soinside.com 2019 - 2024. All rights reserved.