Hanya menyetel ukuran pengambilan bukanlah pendekatan yang benar. javadoc dari Statement#setFetchSize()
sudah menyatakan sebagai berikut:
Memberikan petunjuk kepada driver JDBC mengenai jumlah baris yang harus diambil dari database
Pengemudi sebenarnya bebas untuk menerapkan atau mengabaikan petunjuk tersebut. Beberapa driver mengabaikannya, beberapa driver menerapkannya secara langsung, beberapa driver membutuhkan lebih banyak parameter. Driver MySQL JDBC termasuk dalam kategori terakhir. Jika Anda memeriksa driver MySQL JDBC dokumentasi , Anda akan melihat informasi berikut (gulir sekitar 2/3 ke bawah hingga header ResultSet ):
Untuk mengaktifkan fungsi ini, Anda perlu membuat instance Pernyataan dengan cara berikut:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE);
Harap baca seluruhnya bagian dari dokumen, itu menjelaskan peringatan dari pendekatan ini juga. Berikut kutipan yang relevan:
Ada beberapa peringatan dengan pendekatan ini. Anda harus membaca semua baris di kumpulan hasil (atau menutupnya) sebelum Anda dapat mengeluarkan kueri lain pada koneksi, atau pengecualian akan dilemparkan.
(...)
Jika pernyataan berada dalam ruang lingkup transaksi, maka kunci dilepaskan saat transaksi selesai (yang menyiratkan bahwa pernyataan harus diselesaikan terlebih dahulu). Seperti kebanyakan database lainnya, pernyataan tidak lengkap sampai semua hasil yang tertunda pada pernyataan dibaca atau kumpulan hasil aktif untuk pernyataan ditutup.
Jika itu tidak memperbaiki OutOfMemoryError
(bukan Exception
), maka masalahnya kemungkinan besar Anda menyimpan semua data di memori Java alih-alih memprosesnya segera segera setelah data masuk. Ini akan membutuhkan lebih banyak perubahan dalam kode Anda, mungkin penulisan ulang lengkap. Saya telah menjawab pertanyaan serupa sebelumnya di sini .