Strategi Pengoptimuman untuk Membaca Set Hasil Besar dengan Hibernate
Artikel ini menangani cabaran membaca 90 juta rekod daripada pangkalan data MySQL menggunakan Hibernate tanpa melebihkan RAM.
ScrollableResults Had
Pada mulanya, pengguna cuba menggunakan Hibernate's ScrollableResults untuk menstrimkan hasil secara berperingkat. Walau bagaimanapun, pustaka MySQL Connector/J tidak menyediakan keupayaan menatal sebenar dan memuatkan keseluruhan set hasil ke dalam memori, membawa kepada pengecualian OutOfMemoryError.
setFirstResult/setMaxResults vs. ScrollableResults
Sebagai penyelesaian, pengguna mempertimbangkan untuk menggunakan setFirstResult dan setMaxResults untuk mengambil kumpulan hasil secara berulang. Walau bagaimanapun, pendekatan ini boleh menjadi tidak cekap, terutamanya untuk set hasil yang besar, disebabkan oleh overhed untuk memulakan pertanyaan baharu untuk setiap kelompok.
Pencapaian Kelompok Dioptimumkan menggunakan Native SQL
Penyelesaian paling optimum yang dicadangkan oleh responden adalah untuk keluar dari MySQL J/Connector dan menggunakan batching pertanyaan:
select * from person where id > <max_id_of_last_batch> and <other_conditions> order by id asc limit <batch_size>
Pertanyaan ini mengambil kumpulan rekod berdasarkan ID maksimum yang ditentukan sebelum ini daripada kumpulan sebelumnya dan memesannya mengikut ID dalam tertib menaik. Parameter batch_size menentukan bilangan rekod untuk diambil pada satu masa. Pendekatan ini memastikan bahawa hanya bilangan rekod yang boleh diurus diproses dalam ingatan, mengelakkan keletihan memori.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengambil 90 Juta Rekod dengan Cekap daripada MySQL Menggunakan Hibernate Tanpa Kehabisan Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!