带有SQL Server的JDBC结果集

问题描述 投票:0回答:2

[使用JDBC createStatement进行查询并从SQL Server获取数百万行的ResultSet时,实际上执行了哪些SQL查询,将这些行存储在哪里以及多少行?它使用SQL Server游标吗?我知道客户端存储区(Java代码在其中)仅保留了有限数量的行,那么其余的行又保存在哪里,或者也许尚未从SQL Server中查询到它们?当我查看SQL Server事件探查器时,它仅显示常规查询(它没有添加游标或其他内容的TOP X)

java sql-server jdbc resultset
2个回答
1
投票

取自SQL Server documentation on Adaptive Buffering

通常,当用于SQL Server的Microsoft JDBC驱动程序执行查询时,驱动程序会将所有结果从服务器检索到应用程序内存中。尽管这种方法最大程度地减少了SQL Server上的资源消耗,但它可以在JDBC应用程序中引发产生非常大结果的查询的OutOfMemoryError。

有一种解决方法,SQL Server称为Adaptive Buffering,并且似乎默认为JDBC driver version 2+启用了该方法,您可能想在文档中进行阅读。这是要点:

为了使应用程序能够处理非常大的结果,用于SQL Server的Microsoft JDBC驱动程序提供了自适应缓冲。通过自适应缓冲,驱动程序可以在应用程序需要时从SQL Server检索语句执行结果,而不是一次全部检索。


-1
投票

来自Oracle

表示数据库结果集的数据表,通常是通过执行查询数据库的语句生成。

ResultSet对象维护一个游标,指向其当前行的数据。最初,光标位于第一行之前。的next方法将光标移动到下一行,因为它返回如果ResultSet对象中没有更多行,则返回false在while循环中使用以迭代结果集。

默认的ResultSet对象是不可更新的,并且具有一个仅向前移动。因此,您只能迭代一次,仅从第一行到最后一行。有可能产生可滚动和/或可更新的ResultSet对象。

© www.soinside.com 2019 - 2024. All rights reserved.