如何获得JDBC中的行数?
时间:2020-03-06 15:01:44 来源:igfitidea点击:
我已经执行了JDBC查询以获得结果集。在遍历之前,我想快速找出返回了多少行。我该如何高性能地做到这一点?
我正在使用Java 6,Oracle 11g和最新的Oracle JDBC驱动程序。
解决方案
简短的答案:我们不能。
长答案:我们不能这样做,部分原因是数据库可能在懒惰地评估查询,只在我们要求查询时才返回行。
编辑:使用可滚动的ResultSet可以:)
确实,很久以前(早在2001年!)我就在Java数据库新闻组中问了这个问题,并得到了一些有益的答复。
如果驱动程序支持它(!),则可以调用ResultSet.afterLast()ResultSet.getRow()ResultSet.beforeFirst()。性能可能不好,也可能不好。
更好的解决方案是重写算法,而不需要预先指定大小。
我们将不得不作为一个单独的查询来执行此操作,例如:
SELECT COUNT(1) FROM table_name
某些JDBC驱动程序可能会告诉我们,但这是可选行为,更重要的是,该驱动程序可能还不知道。这可能是由于查询的优化方式所致,例如,Oracle中的两个示例执行策略是尽快获取所有行或者尽快获取第一行。
如果我们执行两个单独的查询(一个查询,另一个查询),则需要在同一事务中执行它们。这将在Oracle上很好地起作用,但在其他数据库上可能会出现问题(例如,SQL Server将显示我们未提交的数据或者阻止外部未提交的更新,具体取决于隔离级别,而Oracle支持一个隔离级别,该级别可为我们提供事务一致的视图数据而不会阻止外部更新)。
通常,尽管有多少行并不重要。通常,这种查询是批处理的或者分页的,并且无论哪种方式,我们都可以通过加载/处理的行的形式获取进度信息,并且可以(显然)检测到结果集的结尾。