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
Lepaskan: 2025-01-04 13:19:40
asal
232 orang telah melayarinya

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");
    }
}
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan