Pada dasarnya, strategi default Oracle untuk toples ojdbc baru-baru ini adalah untuk "mengalokasikan sebelumnya" array per baris "prefetch" yang mengakomodasi ukuran terbesar yang mungkin untuk kembali dari kueri itu. Untuk semua baris. Jadi dalam kasus saya, saya memiliki beberapa VARCHAR2(4000) di sana, dan 50 utas (Pernyataan) * 3 kolom varchar2's * 4000 menambahkan hingga lebih dari gigabyte RAM dengan setFetchSize beberapa ratus [ya]. Tampaknya tidak ada opsi untuk mengatakan "jangan mengalokasikan terlebih dahulu array itu, cukup gunakan ukuran saat mereka masuk." Ojdbc bahkan menyimpan buffer yang telah dialokasikan sebelumnya ini di sekitar antara pernyataan yang disiapkan (cache/koneksi) sehingga dapat digunakan kembali. Benar-benar babi memori.
Satu solusi:gunakan setFetchSize
untuk beberapa jumlah yang waras. Standarnya adalah 10 yang bisa sangat lambat pada koneksi latensi tinggi. Profil dan hanya gunakan setFetchSize setinggi yang benar-benar membuat peningkatan kecepatan yang signifikan.
Solusi lain adalah menentukan ukuran kolom aktual maksimum, lalu mengganti kueri dengan (dengan asumsi 50 adalah ukuran aktual maksimum yang diketahui) select substr(column_name, 0, 50)
Hal lain yang dapat Anda lakukan:kurangi jumlah baris prefetch, tambah Java -Xmx
parameter, hanya pilih kolom yang benar-benar Anda butuhkan.
Setelah kami dapat menggunakan setidaknya prefetch 400 [pastikan untuk membuat profil untuk melihat nomor apa yang baik untuk Anda, dengan latensi tinggi, kami melihat peningkatan hingga ukuran prefetch 3-4K] pada semua kueri, kinerja meningkat secara dramatis.
Saya kira jika Anda ingin benar-benar agresif terhadap baris "sangat panjang" yang jarang, Anda mungkin dapat membuat kueri ulang saat Anda menemukan baris besar [langka] ini.
Detail iklan mual di sini