2012-04-10 12 views
11

Mam kursor zwrócony z bazy danych w 31ms (milisekundach).ResultSet - Cursor: rs.next() Biorąc dużo czasu

Ale kiedy używam tego kursor posiadającą ponad 1500 wierszy do pobierania wierszy

ResultSet rs = (ResultSet)cstm.getObject(6); 

    while(rs.next()){ 
    system.out.println("..."); 
    } 

tylko proste transversing przez każdego wiersza kursora to zabiera więcej niż 40 sekund (40000 ms)

Co może być Gotowe?

Odpowiedz

16

Rzeczywiście, domyślnie JDBC użyć pobrać rozmiar 10. Tak więc, jeśli nie ustawiona na większą wartość, zadzwonić baza dla kolejnych zapisów dokładnie 150 razy ...

Wszystko co musisz zrobić, jest testowanie wydajności poprzez ustawienie fetchSize do .. 100 na przykład:

statement.setFetchSize(100); 

można grać z tym numerem w celu poprawy wydajności w zależności od Environnement.

+0

Dzięki temu zadziałało ... W zamian użyłem ResultSet.setFetchSize (100) ... – faraz

+0

Świetnie :) 100 powinno być dobre tak – Mik378

+0

Dzięki Mik378, zrobiłeś mój dzień ... !!! –

4

masz więcej niż 1500 wierszy w swojej kursorem i rs co jest zwracana w bazie danych jest tylko odniesienie do tego kursora. Tak więc, gdy wywołasz rs.next(), za każdym razem, gdy idzie do cursr bazy danych i uzyskać aktualny rekord wskazany przez wskaźnik kursora.

To oczywiste, że za każdym razem trzeba trochę czasu przejść do bazy danych i pobrać jeden rekord ponad 1500 razy przy każdej iteracji pętli.

+0

Niezłe wyjaśnienie. – Deepak

Powiązane problemy