【问题标题】:JDBC ResultSet with SQL Server带有 SQL Server 的 JDBC 结果集
【发布时间】:2020-07-23 22:18:08
【问题描述】:

当使用 JDBC createStatement 查询并获取数百万行的 ResultSet(来自 SQL Server)时,真正执行了哪些 SQL 查询,这些行存储在哪里以及有多少行?它是否使用 SQL Server 游标? 我知道只有有限数量的行保存在客户端内存(Java 代码所在的位置)中,那么其余行保存在哪里,或者可能尚未从 SQL Server 查询)? 当我查看 SQL Server 分析器时,它只显示正常查询(它没有添加游标或其他内容的 TOP X)

【问题讨论】:

  • 能否请您使用任何示例详细说明您的问题?
  • 在使用 JDBC 的 java 中,我向返回 ResultSet 的 SQL Server 发送查询。在我的 java 代码中,我使用了一个循环。类似于:while (resultSet.nexy())。假设我的查询返回数百万行,这些行保存在哪里? SQL如何执行这个查询?它使用 SQL 游标吗?
  • 请edit你的问题,不要在cmets中提供额外的信息。
  • 这不是附加信息,只是为了澄清同样的问题

标签: java sql-server jdbc resultset


【解决方案1】:

取自SQL Server documentation on Adaptive Buffering:

通常,当 Microsoft JDBC Driver for SQL Server 执行查询时,驱动程序会将服务器的所有结果检索到应用程序内存中。虽然这种方法可以最大限度地减少 SQL Server 上的资源消耗,但它可能会在 JDBC 应用程序中针对产生非常大结果的查询抛出 OutOfMemoryError。

有一种解决方法,SQL Server 调用 Adaptive Buffering 并且默认情况下似乎已为 JDBC driver version 2+ 启用,您可能想在文档中阅读它。这是要点:

为了允许应用程序处理非常大的结果,Microsoft JDBC Driver for SQL Server 提供了自适应缓冲。借助自适应缓冲,驱动程序会根据应用程序的需要从 SQL Server 检索语句执行结果,而不是一次全部检索。

【讨论】:

  • 我还是不明白SQL在自适应缓冲模式下做了什么?它如何查询数据库以及何时将完整结果保存在临时表中?
  • 从客户端来看,没有区别。你执行SQL,就是这样。然而,我不知道自适应缓冲在 SQL Server 内部是如何工作的。
  • 我问的原因是验证如果我同时使用 ResultSet 进行几个大查询,SQL Server 不会自行进入内存不足
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多