Rumah >pangkalan data >tutorial mysql >Mengapa NHibernate QueryOver dengan Eager Fetching Menyebabkan Berbilang Pertanyaan Pangkalan Data?
NHibernate QueryOver dengan Fetch: Berbilang Pertanyaan SQL dan Hit Pangkalan Data Dijelaskan
Apabila cuba mendapatkan entiti dan mengambil senarai berkaitan menggunakan QueryOver NHibernate sintaks, pembangun mungkin menghadapi banyak pertanyaan SQL yang berlebihan dan hits pangkalan data. Isu ini timbul apabila pengambilan tidak sabar-sabar digunakan.
Pertimbangkan kod berikut:
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
Pertanyaan ini akan menghasilkan satu siri hits pangkalan data, termasuk:
Tingkah laku ini berpunca daripada strategi pengambilan NHibernate yang bersemangat. Apabila pengambilan bersemangat didayakan, koleksi berkaitan dimuatkan serta-merta bersama entiti induk. Walau bagaimanapun, setiap objek berkaitan mungkin mempunyai perkaitan berbeza yang perlu diambil, menghasilkan pertanyaan tambahan.
Dalam contoh pemetaan yang disediakan, entiti UserRole dan UsersInRole mempunyai perhubungan banyak-ke-banyak. Apabila tidak sabar-sabar mengambil UserRole dengan perhubungan ini, sesi hanya akan mengandungi maklumat tentang UserRole yang diambil, bukan UsersInRole yang berkaitan.
Untuk mengurangkan isu ini, pengambilan kelompok harus digunakan. Dengan menetapkan sifat BatchSize pada pemetaan koleksi, NHibernate akan mendapatkan semula entiti berkaitan dalam kelompok dan bukannya melaksanakan pertanyaan individu untuk setiap objek yang berkaitan.
Penyelesaian:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
Menetapkan saiz kelompok kepada kedua-dua peta koleksi (termasuk peta kelas) memastikan bahawa berbilang pertanyaan dilaksanakan dan bukannya banyak yang berlebihan. Bilangan pertanyaan yang tepat akan bergantung pada saiz kelompok dan tetapan saiz halaman.
Atas ialah kandungan terperinci Mengapa NHibernate QueryOver dengan Eager Fetching Menyebabkan Berbilang Pertanyaan Pangkalan Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!