Masalah:
Menggunakan sintaks QueryOver NHibernate bersama-sama sintaks QueryOver untuk mendapatkan semula dengan koleksi yang berkaitan menghasilkan banyak hits pangkalan data. Tingkah laku ini kebanyakannya timbul dengan perhubungan banyak-ke-banyak.
Punca:
Mekanisme pengambilan NHibernate yang bersemangat mencetuskan pertanyaan berasingan untuk setiap nilai berbeza yang terdapat dalam lajur kunci asing hubungan . Isu ini berlaku apabila koleksi ditandakan untuk mengambil dengan penuh semangat tetapi ISession tidak mengandungi semua objek yang diperlukan.
Contoh Pemetaan:
public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { Id(x => x.Id); Map(x => x.RoleName); HasManyToMany(x => x.UsersInRole) .Inverse() .LazyLoad() .Table("UsersInRoles"); } }
Senario :
Andaikan anda mempunyai perkara berikut data:
Apabila mendapatkan semula Peranan Pengguna dengan Fetch(x => x.UsersInRole) bersemangat , pertanyaan pertama akan mendapatkan kembali User1 dan Role1. Walau bagaimanapun, memandangkan sesi tidak mengandungi semua pengguna yang dikaitkan dengan Role1, NHibernate akan melaksanakan berbilang pertanyaan tambahan untuk mengambil pengguna yang hilang, mengakibatkan kemerosotan prestasi.
Penyelesaian:
Penyelesaian yang disyorkan ialah menggunakan mekanisme pengambilan kelompok NHibernate dengan menetapkan saiz kelompok untuk koleksi:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
Menetapkan saiz kelompok 25 atau lebih tinggi akan menyebabkan NHibernate mendapatkan sehingga 25 rekod pada satu masa untuk koleksi yang dimuatkan secara malas. Pengoptimuman ini akan menggabungkan pengambilan koleksi dalam pertanyaan awal atau bilangan minimum pertanyaan tambahan, mengurangkan hits pangkalan data dengan ketara.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan NHibernate QueryOver untuk Mengelakkan Pelbagai Hit Pangkalan Data Apabila Mengambil Koleksi Berkaitan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!