哪些JDBC驱动程序正确支持滚动敏感/不敏感?

时间:2016-10-13 16:43:49

标签: java sql jdbc stream buffering

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

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

为了防止将来出现这样的意外,我想知道这种行为是如何广泛传播的,以及哪些其他常见的JDBC驱动程序没有实现预期的实际滚动,所以我知道要注意这一点,如果我碰巧使用其中一个驱动程序。哪些其他常见的JDBC驱动程序不支持流式方式的所有滚动模式?

1 个答案:

答案 0 :(得分:0)

MySQL / MariaDB比Postgres略差。与Postgres一样,它将默认缓冲整个查询结果。与Postgres一样,它只能在没有缓冲的情况下进行前滚动,但与Postgres不同,数据库连接被占用,而查询结果尚未用尽,不能同时用于其他查询。任何锁定和其他资源也会保留,直到结果集耗尽,因此不建议长时间打开结果集。 ref

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