JDBC for Oracle을 사용하여 ResultSet을 반복하는 데 16초 정도의 많은 시간이 소요됩니까?
while( result_set.next() )
{
...
}
나는 사용합니다.System.nanoTime()
각 반복에 걸리는 시간은 밀리초 단위이지만 전체 루프는 약 16초가 소요됩니다.컨디션 테스트에 시간이 많이 걸리는 가능한 이유를 생각하고 있습니다.next()
기능.
참고로 원격 데이터베이스 서버에 연결 중이며 위에서 언급한 방법을 사용하여 수행한 선택 쿼리가 밀리초 내에 다시 계산됩니다.이러한 현상이 발생하는 이유와 최대 1초로 설정된 결과를 반복할 수 있는 시간을 어떻게 확보할 수 있는지에 대한 이유가 있습니까?
편집:
저는 약 4000개의 레코드를 다루고 있으며 각 레코드는 각각 약 10개의 문자 크기를 가진 약 10개의 열을 포함하고 있습니다.
EDIT2 ThanksetFetchsize()가 마술을 했어요, 대박, 대박.
저는 각각 10개의 문자가 있는 4000개의 행과 10개의 열이 있는 테이블을 설정하고 다음과 같은 접근법을 사용하여 간단한 성능 테스트를 하였습니다.RealTimeCounter
사이의 실시간을 측정하는 클래스입니다.start()
그리고.stop()
):
List<String> myResult = new ArrayList<>();
ResultSet rs = s.executeQuery("SELECT * FROM Performance");
RealTimeCounter rtc = new RealTimeCounter();
rtc.start();
while(rs.next()) {
myResult.add(rs.getString(1));
}
rtc.stop();
System.out.println(rtc);
결과:
- 기본 가져오기 크기: 실행 시간은 약 20초입니다.
- 가져오기 크기 = 100: 실행 시간은 약 2.2초입니다.
- 가져오기 크기 = 500: 실행 시간은 약 450msec입니다.
- 가져오기 크기 = 2000: 실행 시간은 약 120msec입니다.
- 가져오기 크기 = 4000: 실행 시간은 약 50msec입니다.
- 가져오기 크기 = 4001: 실행 시간은 약 10msec(!!)입니다.
따라서 페치 크기는 실행 속도에 상당한 영향을 미칩니다.
반면에, 가져오기 크기는 메모리 소비에 약간의 영향을 미칩니다.흥미롭게도, 다음을 사용한 빠른 분석Runtime.getRuntime().freeMemory();
하지만 위의 코드가 내가 예상했던 것보다 훨씬 덜 영향을 미친다는 것을 보여주기 전과 후에.제가 받은 숫자는 다음과 같습니다.
- 기본 가져오기 크기: 665k
- 가져오기 크기 = 100: 665k
- 가져오기 크기 = 500: 665k
- 가져오기 크기 = 2000: 743k
- 가져오기 크기 = 4000: 821k
- 가져오기 크기 = 4001: 861k
ResultSet 가져오기 크기를 변경해 보십시오.기본적으로 Oracle JDBC 드라이버는 데이터베이스 커서에서 한 번에 10개의 행만 결과 집합을 수신합니다.성능이 크게 향상되지는 않을 수 있지만 드라이버를 더 빨리 작동시킬 수 있는 다른 옵션은 많지 않습니다.
언급URL : https://stackoverflow.com/questions/17744090/iterating-a-resultset-using-the-jdbc-for-oracle-takes-a-lot-of-time-about-16s
'programing' 카테고리의 다른 글
문자열을 데이터 프레임에서 부동으로 변환 (0) | 2023.07.20 |
---|---|
Oracle에 기본 키에 대한 자동 증분 기능이 없는 이유는 무엇입니까? (0) | 2023.07.20 |
Oracle에서 대문자 및 소문자 영숫자 임의 문자열 생성 (0) | 2023.07.20 |
SQL Server Int 또는 BigInt 데이터베이스 테이블 ID (0) | 2023.07.20 |
어떻게 두 세트를 추가합니까? (0) | 2023.07.20 |