【问题标题】:Which JDBC drivers support scroll sensitive/insensitive properly?哪些 JDBC 驱动程序正确支持滚动敏感/不敏感?
【发布时间】:2016-10-13 16:43:49
【问题描述】:

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

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

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

【问题讨论】:

  • JDBC 充满了数据库之间的差异,有时甚至是同一数据库的驱动程序(不是驱动程序版本)之间的差异。在这里开始列出它们太宽泛了。
  • 您的问题还不清楚。您是否正在寻找与您在此处指定的驱动程序相同的其他驱动程序?或者没有的替代驱动程序?当然,并非所有驱动程序都是平等的。你可以试试the ones from my employer。数据库也不同; Virtuoso comes from my employer.
  • 我编辑了问题以澄清意图。我正在寻找不实现类似于 postgres 驱动程序的流式滚动的驱动程序,所以如果我碰巧使用其中一个驱动程序,我知道要注意这种行为。

标签: java sql jdbc stream buffering


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2018-04-08
    • 1970-01-01
    相关资源
    最近更新 更多