【问题标题】:Is the JDBC ResultSet an application-level query cursorJDBC ResultSet 是应用程序级查询游标吗
【发布时间】:2015-12-15 04:03:19
【问题描述】:

database cursor 定义与 JDBC ResultSet API 惊人地相似。

尽管如此,MySQL doesn't support database cursors:

MySQL 不支持 SQL 游标,JDBC 驱动也不支持 模拟它们,所以 setCursorName() 没有效果。

那么,JDBC 实现是否是一种模仿数据库游标实现的数据访问规范,即使数据库并不真正支持这样的特性?

【问题讨论】:

  • 我认为 JDBC 没有为特定数据库构建。它提供一般功能。

标签: java mysql jdbc database-cursor


【解决方案1】:

名字里有什么...

确实,ResultSet 和数据库游标在语义上是相似的。 The SQL:2011 standard 指定:

游标是一种机制,通过它可以一次对表的行进行操作(例如,返回到主机编程语言)。

听起来确实很像ResultSet。再往下,SQL:2011 标准继续提到:

游标声明描述符和结果集描述符有四个属性:敏感性属性(SENSITIVE、INSENSITIVE 或 ASENSITIVE)、可滚动性属性(SCROLL 或 NO SCROLL)、可保持性属性(WITH HOLD 或 WITHOUT HOLD ) 和可退货性属性(WITH RETURN 或 WITHOUT RETURN)。

换句话说,这些功能都不是由 JDBC(或 ODBC)规范团队“发明”的。它们确实以这种形式存在于许多 SQL 数据库实现中,并且与任何规范一样,上述许多特性在 SQL 实现中也是可选的。

Jess 已经对 MySQL 部分做出了权威回应。我想补充一点,JDBC 与任何高级规范一样,具有必需的部分和可选的部分。

查看JDBC Spec,可以看到以下相关部分。

6.3 JDBC 4.2 API 合规性

符合 JDBC 规范的驱动程序必须执行以下操作:

[...]

它必须实现Statement接口,但以下情况除外 可选方法:

  • [...]
  • setCursorName
  • [...]

它必须实现 ResultSet 接口,但以下情况除外 可选方法:

  • [...]
  • getCursorName
  • [...]

ResultSet 类型的实现也是如此。再往下看,你会发现:

方法 DatabaseMetaData.supportsResultSetType 返回 true 如果 驱动程序支持指定的类型,否则false

【讨论】:

    【解决方案2】:

    你当然可以这样想。所有这些概念都是从 ODBC 继承的,因此您可以感谢(责备?)历史是这样的。大多数 dbs 并没有广泛支持游标,因为在 JDBC 等 API 中提供了功能。特别是在 MySQL 中,从 MySQL 5.0 开始支持游标“获取”,这意味着驱动程序不会强制读取整个结果,无论是否需要。这意味着可以在几乎没有成本的情况下尽早放弃结果集。但是,需要额外的往返来定期请求行块。 MySQL Connector/J 默认不强制执行 FORWARD_ONLY 语义,并将整个结果缓冲在客户端中,允许“可滚动”。但是,由于服务器中的实现,这不允许对其他事务中提交的更改敏感。通常在可能的情况下模仿/模拟功能以提供 API 的便利性。

    【讨论】:

      【解决方案3】:

      根据我对 JDBC ResultSet 的理解,我会说它不依赖于它连接的数据库,它的行为是相同的。

      JDBC 将始终将默认行数(而不是整个结果集)提取到本地内存。一旦您到达所获取行的最后一行(例如通过执行 next() 并尝试访问下一行)并且如果结果中有更多行,则将对数据库进行另一个往返调用以获取下一个一批行到本地内存。

      即使您可以比平时设置要在本地内存中获取的行数,您也可以考虑使用 CachedRowSet。

      当您在 Statement 上设置 fetchSize() 时,您只是向 JDBC 驱动程序指示您希望它应该获取多少,但 JDBC 驱动程序可以随意忽略您的指令。我不知道 Oracle 驱动程序对 fetchSize() 做了什么。大多数情况下,它观察到 MySQL JDBC 驱动程序将始终获取所有行,除非您将 fetchSize() 设置为 Integer.MIN_VALUE。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 2012-08-11
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多