30

結果セットを取得するためにJDBCクエリを実行しました。繰り返す前に、返された行数をすばやく確認したいと思います。どうすれば高性能でこれを行うことができますか?

Java 6、Oracle 11g、および最新のOracleJDBCドライバーを使用しています。

4

7 に答える 7

32

You're going to have to do this as a separate query, for example:

SELECT COUNT(1) FROM table_name

Some JDBC drivers might tell you but this is optional behaviour and, more to the point, the driver may not know yet. This can be due to how the query is optimised eg two example execution strategies in Oracle are to get all rows as quickly as possible or to get the first row as quickly as possible.

If you do two separate queries (one a count and the other the query) then you'll need to do them within the same transaction. This will work well on Oracle but can be problematic on other databases (eg SQL Server will either show you uncommitted data or block on an external uncommitted update depending on your isolation level whereas Oracle supports an isolation level that gives you a transactionally consistent view of the data without blocking on external updates).

Normally though it doesn't really matter how many rows there are. Typically this sort of query is either batch processed or paged and either way you have progress information in the form of rows loaded/processed and you can detect the end of the result set (obviously).

于 2008-10-02T14:34:26.100 に答える
22
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! :)
于 2012-04-13T10:33:09.387 に答える
19

簡単な答え: できません。

長い答え: データベースがクエリを遅延して評価し、要求した行のみを返す可能性があるため、できません。

編集:スクロール可能なResultSetを使用すると、次のことができます:)

実際、私はずっと前 (2001 年にさかのぼります!) に Java データベース ニュースグループでこの質問をし、いくつかの役立つ回答をもらいました。

于 2008-10-02T14:26:43.030 に答える
14

JDBC から行数を取得するには:

ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME");
rs.next();
int count = rs.getInt(1);
于 2013-07-18T08:11:32.280 に答える
4

If your driver supports it(!), you can call ResultSet.afterLast() ResultSet.getRow() ResultSet.beforeFirst(). Performance may or may not be good.

A better solution would be to rewrite your algorithm not to require the size up front.

于 2008-10-02T14:30:51.943 に答える
0

コード:

//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();
于 2013-04-28T21:54:36.977 に答える