哪些 JDBC 驱动程序正确支持滚动 sensitive/insensitive?

Which JDBC drivers support scroll sensitive/insensitive properly?

我刚刚发现 Postgres Java JDBC 驱动程序并不真正支持使用流的 SCROLL_SENSITIVE/SCROLL_INSENSITIVE 模式,而是通过加载来模拟这些模式完整的结果集一次全部存入客户端内存。对于具有大结果集的查询,这可能会导致意外的大量内存使用,尤其是在像 Java 这样几乎不支持未装箱值的语言中。使用 FORWARD_ONLY 模式时,驱动程序按预期流式传输结果。

(details;据我了解,这是 Postgres 有线协议的限制,尽管理论上驱动程序可以通过将查询转换为显式游标来解决这个问题。)

为了防止将来出现此类意外,我想知道这种行为的传播范围有多广,以及哪些其他常见 JDBC 驱动程序没有在预期的位置实现真正的滚动,所以我知道要当心为此,如果我碰巧使用其中一个驱动程序。哪些其他常见 JDBC 驱动程序不支持流式传输方式中的所有滚动模式?

MySQL/MariaDB 比 Postgres 稍差。与 Postgres 一样,它默认会缓冲整个查询结果。和Postgres一样只能向前滚动,不能缓冲,但不像Postgres是在一个查询结果还没有用完时,数据库连接就被占用了,不能同时用于其他查询。在结果集耗尽之前,还会保留任何锁和其他资源,因此不建议长时间打开结果集。 ref

Oracle 默认流式传输结果,但服务器或网络协议不支持向后滚动。如果设置了 SCROLL_INSENSITIVESCROLL_SENSITIVE,JDBC 驱动程序通过缓存结果来模拟滚动。所以除了默认之外,这类似于 Postgres。 ref