Versi singkatnya adalah, panggil stmt.setFetchSize(50);
dan conn.setAutoCommit(false);
untuk menghindari membaca seluruh ResultSet
ke dalam memori.
Inilah yang dikatakan dokumen:
Mendapatkan hasil berdasarkan kursor
Secara default, driver mengumpulkan semua hasil untuk kueri sekaligus. Ini bisa merepotkan untuk kumpulan data besar sehingga driver JDBC menyediakan sarana untuk mendasarkan ResultSet pada kursor database dan hanya mengambil sejumlah kecil baris.
Sejumlah kecil baris di-cache di sisi klien koneksi dan ketika habis, blok baris berikutnya diambil dengan memposisikan ulang kursor.
Catatan:
ResultSets berbasis kursor tidak dapat digunakan dalam semua situasi. Ada sejumlah batasan yang akan membuat pengemudi diam-diam kembali mengambil seluruh ResultSet sekaligus.
Koneksi ke server harus menggunakan protokol V3. Ini adalah default untuk (dan hanya didukung oleh) server versi7.4 dan yang lebih baru.-
Koneksi tidak boleh dalam mode komit otomatis. Backend menutup kursor di akhir transaksi, jadi dalam mode autocommit, backend akan menutup kursor sebelum apa pun dapat diambil darinya.-
Pernyataan harus dibuat dengan jenis ResultSet dari ResultSet.TYPE_FORWARD_ONLY. Ini adalah default, jadi tidak ada kode yang perlu ditulis ulang untuk memanfaatkannya, tetapi ini juga berarti bahwa Anda tidak dapat menggulir mundur atau melompat-lompat di dalam ResultSet.-
Kueri yang diberikan harus berupa satu pernyataan, bukan beberapa pernyataan yang dirangkai dengan titik koma.
Contoh 5.2. Menyetel ukuran pengambilan untuk mengaktifkan dan menonaktifkan kursor.
Mengubah kode ke mode kursor semudah mengatur ukuran pengambilan Pernyataan ke ukuran yang sesuai. Menyetel ukuran pengambilan kembali ke 0 akan menyebabkan semua baris di-cache (perilaku default).
// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();
// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
System.out.print("a row was returned.");
}
rs.close();
// Turn the cursor off.
st.setFetchSize(0);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
System.out.print("many rows were returned.");
}
rs.close();
// Close the statement.
st.close();