2011-10-06 5 views
3

내 Java 코드에서 select 문으로 oracle 데이터베이스 테이블에 액세스합니다. 많은 행 (약 50,000 행)을 수신하므로 rs.next()에는 모든 행을 처리하는 데 시간이 필요합니다.CachedRowSet이 ResultSet보다 느립니다?

using ResultSet, the processing of all rows (rs.next) takes about 30 secs 
내 목표는이 과정을 빠르게하는 것입니다, 그래서 코드를 변경하고 지금 CachedRowSet 사용

다음 CachedRowSet가 정상 ResultSet보다 느린 이유

using CachedRowSet, the processing of all rows takes about 35 secs 

이해가 안 때문에 CachedRowSet은 모든 데이터를 즉시 검색하고 ResultSetrs.next이 호출 될 때마다 데이터를 검색합니다.

try { 
    stmt = masterCon.prepareStatement(sql); 
    rs = stmt.executeQuery(); 

    CachedRowSet crset = new CachedRowSetImpl(); 
    crset.populate(rs); 

    while (rs.next()) { 
     int countStar = iterRs.getInt("COUNT"); 
     ... 
    } 
} finally { 
    //cleanup 
} 
+0

CachedRowSet이 모든 데이터를 한 번에 가져 오더라도 해당 데이터가 반환되는 시간이 필요합니다. 원시 SQL 쿼리가 오라클 콘솔에서 가져 오는 시간은 얼마입니까? –

답변

3

이>라고? 그것은 정확히 어떻게 작동하는지 구현에 달렸습니다. 그리고 한 번에 청크를 가져 오면 놀라지 않을 것입니다. 꽤 큰 덩어리. 기본적으로 당신이 어떤 목적을 위해 별도의 복사 작업이있어 ​​-

난 당신이 기본적으로 모두가 다음 CachedRowSet 액세스는 모든 데이터를 복사하는 데 걸리는 시간을보고있다 생각한다.

4

의 CachedRowSet 당신이 더 이상 연결이 필요하지 않는 메모리 즉의 결과를 캐시 : 여기

는 코드의 일부이다. 그러므로 그것은 처음에는 "더 느리다".

CachedRowSet 객체는 항상 가능한 가 그 데이터 소스에 접속하지 않고 동작 할 수있게 메모리에 그 로우 캐시 데이터의 행에 대한 컨테이너이다.

-http://download.oracle.com/javase/1,5.0/docs/api/javax/sql/rowset/CachedRowSet.html 당신이 ResultSet 데이터마다 rs.next()를 검색 할 것이라고 생각한다 무엇

3

CachedRowSet에 postgres jdbc 드라이버를 연결하면 문제가 발생합니다.

은 열의 유형을 알아야하므로 만들려는 Java 객체가 무엇인지 알고 있어야합니다. (신이 알고있는 바는 무엇입니까?)

따라서 열 메타 데이터를 가져 오기 위해 더 많은 왕복 이동이 수행됩니다. 매우 큰 볼륨에서는 이것이 실제 문제가됩니다. DB가 원격 서버에있는 경우 네트워크 대기 시간 때문에 실제 문제입니다.

우리는 수년간 CachedRowSet을 사용해 왔으며이를 발견했습니다. 우리는 지금 우리 자신의 CachedRowSet을 구현합니다. 어쨌든 우리는 그 어떤 것도 사용하지 않았기 때문입니다. 모든 유형에 대해 getString을 수행하고 이것이 가장 빠른 방법 인 것으로 생각됩니다.

기본적으로 postgres 드라이버가 모든 것을 가져 오는 데 페치 크기에는 문제가 없습니다.

0

일반 ResultSet을 사용하면 RowPrefetch 및 FetchSize를 사용하여 더 많은 최적화 옵션을 얻을 수 있습니다.

이들은 네트워크 전송 청크와 while 루프에서 처리를 최적화하므로 rs.next()는 항상 작업 할 데이터가 있습니다.

FetchSize의 기본값은 10 (Oracle 최신 버전)으로 설정되어 있지만 RowPrefetch가 설정되지 않은 것으로 알고 있습니다. 따라서 네트워크 전송이 전혀 최적화되지 않았다는 것을 의미합니다.