Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengoptimumkan NHibernate QueryOver untuk Mengelakkan Pelbagai Hit Pangkalan Data Apabila Mengambil Koleksi Berkaitan?

Bagaimanakah Saya Boleh Mengoptimumkan NHibernate QueryOver untuk Mengelakkan Pelbagai Hit Pangkalan Data Apabila Mengambil Koleksi Berkaitan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-04 13:19:40237semak imbas

How Can I Optimize NHibernate QueryOver to Avoid Multiple Database Hits When Fetching Related Collections?

Mengatasi Berbilang Pertanyaan SQL dalam NHibernate QueryOver dengan Fetch

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:

  • Pengguna1 mempunyai Peranan1
  • Pengguna2 mempunyai kedua-dua Peranan1 dan Peranan2

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!

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