JDBCクエリを実行して結果セットを取得しました。繰り返す前に、返された行数をすばやく見つけたいと思います。高性能でこれを行うにはどうすればよいですか?
Java 6、Oracle 11g、および最新のOracle JDBCドライバーを使用しています。
これを個別のクエリとして実行する必要があります。たとえば、次のとおりです。
SELECT COUNT(1) FROM table_name
一部のJDBCドライバーはユーザーに通知する場合がありますが、これはオプションの動作であり、さらに重要なことに、ドライバーはまだ知らない場合があります。これは、クエリの最適化方法が原因である場合があります。たとえば、Oracleの2つの実行戦略の例では、すべての行をできるだけ早く取得するか、最初の行をできるだけ早く取得します。
2つの別々のクエリ(1つはクエリで、もう1つはクエリ)を実行する場合、同じトランザクション内で実行する必要があります。これはOracleでは問題なく動作しますが、他のデータベースでは問題が発生する可能性があります(たとえば、SQL Serverは分離レベルに応じてコミットされていないデータを表示するか、外部のコミットされていない更新をブロックしますが、Oracleはトランザクションの一貫したビューを提供する分離レベルをサポートします外部更新でブロックしないデータ)。
通常、行の数は重要ではありませんが。通常、この種のクエリはバッチ処理またはページングされ、ロード/処理された行の形式で進行状況情報を取得し、結果セットの終わりを検出できます(明らかに)。
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.
三項演算子付き1行
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();