我执行JDBC查询,以获得一个结果。 遍历它之前,我想很快找出多少行返回。 我怎样才能做到这一点具有高性能?
我使用Java 6中,是Oracle 11g,而最新的Oracle JDBC驱动程序。
我执行JDBC查询,以获得一个结果。 遍历它之前,我想很快找出多少行返回。 我怎样才能做到这一点具有高性能?
我使用Java 6中,是Oracle 11g,而最新的Oracle JDBC驱动程序。
你将不得不这样做,因为一个单独的查询,例如:
SELECT COUNT(1) FROM table_name
一些JDBC驱动程序可能会告诉你,但是这是可选行为,更重要的是,司机可能还不知道。 这可能是由于查询如何在Oracle中优化例如两个例子执行策略是尽可能快地得到所有行或尽快拿到第一排。
如果你做的两个单独的查询(一个计数,并且其他查询),那么你就需要在同一事务中做他们。 这将很好地工作在Oracle,但可以在其他数据库问题(如SQL Server将要么告诉你在这取决于你的事务隔离级别外部提交的更新未提交的数据或块,而Oracle支持的隔离级别,让你的事务上一致的看法数据而不阻塞外部更新)。
通常情况下,虽然它并没有真正不管有多少行也有。 通常这种查询是分批处理或寻呼,你必须在加载/处理的行的形式进度信息和可以检测结果集(明显)的端两种方式。
简短的回答:你不能。
龙答:你不能,一方面是因为数据库可能是懒洋洋地评估查询,只返回行,你问他们。
编辑:使用滚动的ResultSet可以:)
事实上,我问在Java数据库过这个问题新闻组在很久以前(早在2001年!),并有一些有用的回应 。
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! :)
为了充分利用JDBC的行数:
ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME");
rs.next();
int count = rs.getInt(1);
如果你的驱动程序支持它(!),你可以调用ResultSet.afterLast()由resultset.getRow()ResultSet.beforeFirst()。 性能可能会或可能不会好。
一个更好的解决办法是重写你的算法不要求规模达阵。
没有三元运算符
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();
码:
//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();