문제

resultSet을 얻기 위해 JDBC 쿼리를 실행했습니다. 반복하기 전에 얼마나 많은 행이 반환되었는지 빨리 알고 싶습니다. 고성능으로 어떻게 할 수 있습니까?

Java 6, Oracle 11G 및 최신 Oracle JDBC 드라이버를 사용하고 있습니다.

도움이 되었습니까?

해결책

예를 들어 별도의 쿼리 로이 작업을 수행해야합니다.

SELECT COUNT(1) FROM table_name

일부 JDBC 드라이버가 당신에게 말할 수도 있지만 이것은 선택적 행동이며, 더 많은 시점에서 운전자는 아직 알지 못할 수도 있습니다. 이는 쿼리가 최적화되는 방식으로 인해 Oracle의 두 가지 예제 실행 전략이 가능한 한 빨리 모든 행을 얻거나 가능한 한 빨리 첫 번째 행을 얻는 것입니다.

두 개의 개별 쿼리 (한 카운트와 다른 쿼리)를 수행하면 동일한 트랜잭션 내에서 수행해야합니다. 이것은 Oracle에서 잘 작동하지만 다른 데이터베이스에서는 문제가 될 수 있습니다 (예 : SQL Server는 분리 레벨에 따라 외부 커뮤니케이션 업데이트에서 커밋되지 않은 데이터 또는 블록을 표시하는 반면 Oracle은 트랜잭션으로 일관된 관점을 제공하는 격리 수준을 지원합니다. 외부 업데이트에서 차단하지 않은 데이터).

일반적으로 얼마나 많은 행이 있는지는 중요하지 않습니다. 일반적으로 이러한 종류의 쿼리는 배치 처리 또는 PAGED이며로드/처리 된 행 형태의 진행 정보가 있으며 결과 세트의 끝을 감지 할 수 있습니다 (명백히).

다른 팁

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! :)

짧은 대답 : 당신은 할 수 없습니다.

긴 답변 : 데이터베이스가 쿼리를 게으르게 평가할 수 있기 때문에 부분적으로는 쿼리를 요구할 수 없기 때문에 구할 수는 없습니다.

편집 : 스크롤 가능한 결과 세트를 사용하여 할 수 있습니다 :)

실제로, 나는 Java Database Newsgroup 에서이 질문을 오래 전에 (2001 년으로 돌아 왔습니다!) 유용한 응답.

JDBC에서 행의 수를 얻으려면 :

ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME");
rs.next();
int count = rs.getInt(1);

드라이버가이를 지원하는 경우 (!), resultSet.fterLast () resultSet.getRow () resultSet.beforefirst ()를 호출 할 수 있습니다. 성능은 좋거나 좋지 않을 수 있습니다.

더 나은 솔루션은 크기를 앞쪽으로 필요로하지 않도록 알고리즘을 다시 작성하는 것입니다.

3 대 연산자없이

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.

Ternary Operator와 함께 한 줄

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();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top