我正在开发数据库导入工具。我正在通过设置 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
?提前感谢帮助 - 试图更好地理解这一点