我已经执行了JDBC查询以获取结果集。在迭代之前,我想快速找出返回的行数。我怎样才能以高性能做到这一点?
我正在使用Java 6,Oracle 11g和最新的Oracle JDBC驱动程序。
答案 0 :(得分:32)
您将不得不将此作为单独的查询执行,例如:
SELECT COUNT(1) FROM table_name
某些JDBC驱动程序可能会告诉您,但这是可选行为,更重要的是,驱动程序可能还不知道。这可能是由于查询的优化方式,例如Oracle中的两个示例执行策略是尽可能快地获取所有行或尽快获得第一行。
如果您执行两个单独的查询(一个是计数而另一个是查询),那么您需要在同一个事务中执行这些查询。这在Oracle上运行良好,但在其他数据库上可能会有问题(例如,SQL Server将显示未提交的数据或阻止外部未提交的更新,具体取决于您的隔离级别,而Oracle支持隔离级别,为您提供事务一致的视图。数据没有阻止外部更新)。
通常情况下,有多少行并不重要。通常,这种查询是批处理或分页的,无论哪种方式,您都可以加载/处理行的形式获得进度信息,并且可以检测结果集的结尾(显然)。
答案 1 :(得分:19)
ResultSet rs = stmt.executeQuery(sql);
int rowCount = rs.last() ? rs.getRow() : 0; // Number of rows in result set. Don't forget to set cyrsor to beforeFirst() row! :)
答案 2 :(得分:18)
简短回答:你不能。
答案很长:你不能,部分是因为数据库可能懒惰地评估查询,只是在你要求时返回行。
编辑:使用可滚动的ResultSet,您可以:)
事实上,我很久以前就在Java数据库新闻组中提出了这个问题(早在2001年!)并且有一些helpful responses。
答案 3 :(得分:10)
从JDBC获取行数:
ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME");
rs.next();
int count = rs.getInt(1);
答案 4 :(得分:4)
如果您的驱动程序支持它(!),您可以调用ResultSet.afterLast()ResultSet.getRow()ResultSet.beforeFirst()。表现可能好也可能不好。
更好的解决方案是重写算法,而不是预先要求大小。
答案 5 :(得分:2)
没有三元运算符
rs.last(); // Moves the cursor to the last row in this ResultSet object.
int rowCount = rs.getRow(); //Retrieves the current row number.
rs.beforeFirst(); //Moves the cursor to the front of this ResultSet object,just before the first row.
三元运算符仅一行
int rowCount = rs.last() ? rs.getRow() : 0;
rs.beforeFirst();
答案 6 :(得分:-1)
代码:
//Create a Statement class to execute the SQL statement
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS COUNT FROM
TABLENAME");
while(rs.next()) {
System.out.println("The count is " + rs.getInt("COUNT"));
}
//Closing the connection
con.close();