Antaramuka ScrollableResults Hibernate menyediakan cara untuk mengulangi hasil pertanyaan tanpa memuatkan keseluruhan keputusan yang ditetapkan ke dalam memori. Walau bagaimanapun, seperti yang ditonjolkan oleh soalan ini, menggunakan ScrollableResults dengan bilangan rekod yang banyak boleh membawa kepada isu memori jika pemacu MySQL Connector/J digunakan.
Dalam kes sedemikian, satu-satunya pilihan praktikal adalah untuk mengulangi hasil carian. dalam kelompok menggunakan kaedah setFirstResult dan setMaxResults. Walaupun pendekatan ini mungkin kelihatan tidak cekap, terutamanya apabila menangani offset yang besar, ia adalah cara yang paling boleh dipercayai untuk mengelakkan masalah ingatan.
Sebaik-baiknya, sesi tanpa kewarganegaraan harus digunakan untuk mengelakkan sebarang caching peringkat sesi atau isu penjejakan kotor .
Satu lagi potensi pengoptimuman ialah menggunakan medan id sebagai lajur terakhir indeks dan mengubah suai pertanyaan untuk mendapatkan sekumpulan rekod pada satu masa, menggunakan id tertinggi kumpulan sebelumnya sebagai titik permulaan. Ini boleh meningkatkan prestasi jika syarat_lain dalam pertanyaan menggunakan syarat kesamarataan.
Dengan mengubah suai pertanyaan seperti berikut:
select * from person where id > <max_id_of_last_batch> and <other_conditions> order by id asc limit <batch_size>
anda boleh mengelakkan prestasi yang dicetuskan disebabkan oleh memuatkan offset yang besar dan mencapai lebih banyak proses lelaran yang cekap.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memproses 90 Juta Rekod dengan Cekap dengan Hibernate Tanpa Kehabisan Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!