Rumah >pangkalan data >tutorial mysql >Mengapa NHibernate QueryOver dengan Eager Fetching Menyebabkan Berbilang Pertanyaan Pangkalan Data?

Mengapa NHibernate QueryOver dengan Eager Fetching Menyebabkan Berbilang Pertanyaan Pangkalan Data?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-05 02:40:41333semak imbas

Why Does NHibernate QueryOver with Eager Fetching Cause Multiple Database Queries?

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:

  • Pertanyaan awal untuk mendapatkan semula entiti UserRole.
  • Berbilang pertanyaan berikutnya untuk dapatkan semula entiti UsersInRole untuk setiap UserRole.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn