当前位置: 首页 > 知识库问答 >
问题:

JDBC结果集是应用程序级查询游标吗

孔运良
2023-03-14

数据库游标定义与 JDBC ResultSet API 惊人地相似。

>

  • 数据库游标可以只向前的ResultSet.TYPE_FORWARD_ONLY。

    数据库游标可以滚动,甚至可以像ResultSet一样有一个敏感度设置。TYPE_SCROLL_SENSITIVE

    还支持可保持性,如ResultSet.HOLD_CURSORS_OVER_COMMIT

    甚至对位置更新/删除的支持也被复制到JDBC ResultSet.CONCUR_Updateable中

    但是尽管所有这些相似,MySQL不支持数据库游标:

    MySQL不支持SQL游标,并且JDBC驱动程序不模拟它们,因此setCursorName()无效。

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

  • 共有3个答案

    齐胜涝
    2023-03-14

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

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

    即使可以设置要在本地内存中提取的行数,也可以考虑CachedRowSet。

    当您在语句上设置fetchSize()时,您只是给JDBC驱动程序一个指令,告诉它您希望它取多少,但是JDBC驱动程序可以自由地忽略您的指令。我不知道Oracle驱动程序如何处理fetchSize()。大多数时候,它观察到MySQL JDBC驱动程序总是会获取所有行,除非您将fetchSize()设置为Integer.MIN_VALUE。

    汝繁
    2023-03-14

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

    微生毅
    2023-03-14

    名字里有什么...

    实际上,结果集数据库游标在语义上是相似的。SQL:2011标准规定:

    游标是一种机制,通过这种机制,表的行可以一次一个地作(例如,返回到宿主编程语言)。

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

    游标声明描述符和结果集描述符具有四个属性:敏感度属性(敏感、不敏感或非敏感)、滚动性属性(滚动或无滚动)、可保持性属性(带保留或不保留)和可返回性属性(带 RETURN 或不带返回)。

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

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

    查看JDBC规范,我可以看到以下相关部分。

    符合JDBC规范的驱动程序必须做到以下几点:

    [...]

    它必须实现语句接口,但以下可选方法除外:

      <李>[...] < li>setCursorName <李>[...]

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

    • […]
    • getCursorName
    • […]

    ResultSet类型的实现也是如此。在规格的下方,您会发现:

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

     类似资料:
    • 主要内容:ResultSet类型,ResultSet的并发性,浏览结果集,查看结果集,更新结果集SQL语句执行后从数据库查询读取数据,返回的数据放在结果集中。 语句用于从数据库中选择行并在结果集中查看它们的标准方法。 接口表示数据库查询的结果集。 对象维护指向结果集中当前行的游标。 术语“结果集”是指包含在对象中的行和列数据。 接口的方法可以分为三类: 浏览方法:用于移动光标。 获取方法:用于查看光标指向的当前行的列中的数据。 更新方法:用于更新当前行的列中的数据。 然后在基础数据库中更新数

    • 问题内容: 如何在同一例程中使用两个游标?如果我删除了第二个游标声明并获取了循环,一切都将正常工作。该例程用于在我的webapp中添加朋友。它使用当前用户的ID和我们要添加的朋友的电子邮件作为朋友,然后检查电子邮件是否具有相应的用户ID,如果不存在朋友关系,它将创建一个。除此以外的任何其他常规解决方案也都很好。 问题答案: 我终于写了一个执行相同功能的不同函数: 我希望这是一个更好的解决方案,无论

    • 问题内容: 我有一个查询。现在,此查询当然返回一个结果集,我想要的是查询此查询的结果集,例如,我只希望上述查询具有唯一的名称。我应该提一下,我知道我可以在Query1中使用,但这只是一个示例,我的实际情况有些不同,我想知道的是是否可以查询上一个查询的结果集。我正在使用SQL Server 2012。 问题答案: 您可以使用该子句

    • 对于redis查询返回结果顺序的判断,我有些怀疑,特别是对于hgetall查询 例如,我将一些数据按其枚举的顺序放入数据库: 不带任何其他参数的“keys key:*”命令是否总是按照数据在数据库中出现的顺序返回该数据,还是会尝试以任何方式对数据进行排序?

    • 查询结果的排序 当发送查询命令到ElasticSearch中,返回的文档集合默认会按照计算出来的文档打分排序(已经在本章的 Lucene的默认打分算法 一节中讲到)。这通常是用户希望的:结果集中的第一个文档就是查询命令想要的文档。然而,有的时候我们希望改变这种排序。这很简单,因为我们已经用过了单个字符串类型的数据。让我们看如下的样例: { "query" : { "terms" : { "t

    • 问题内容: 嘿,我是新来的hibernate。我不得不说,它确实简化了SQL查询的所有操作。但是,操作返回的结果目前对我来说很头疼。 结果以列表形式返回。大多数时候,我真的希望结果位于结果集中,这样我可以像使用结果集那样更轻松地操作它,可以按列名或索引指定值。在List中,我几乎归自己的贵族所有。 在某种程度上,我可以将列表检索到JSF数据表中,然后直接调用该成员。我不能总是这样做。不要问我为什么