Rumah > pangkalan data > tutorial mysql > Mengapa NHibernate QueryOver's Eager Loading Menyebabkan Berbilang Pertanyaan Pangkalan Data?

Mengapa NHibernate QueryOver's Eager Loading Menyebabkan Berbilang Pertanyaan Pangkalan Data?

Patricia Arquette
Lepaskan: 2025-01-04 21:54:38
asal
495 orang telah melayarinya

Why Does NHibernate QueryOver's Eager Loading Cause Multiple Database Queries?

Eager Loading in NHibernate QueryOver Keputusan dalam Berbilang Pertanyaan Pangkalan Data

Apabila melakukan pengambilan senarai berkaitan menggunakan NHibernate QueryOver, ia mungkin terhasil dalam pelbagai pertanyaan pangkalan data. Ini boleh membawa kepada trafik pangkalan data yang meningkat dengan ketara dan prestasi yang berkurangan.

Pertimbangkan senario berikut:

Session.QueryOver<UserRole>()
       .Fetch(x => x.UsersInRole).Eager
       .List();
Salin selepas log masuk

Pertanyaan ini cuba memilih koleksi UserRoles dan mengambil UsersInRole yang berkaitan dengan penuh semangat. Walau bagaimanapun, ini menghasilkan berbilang pertanyaan pangkalan data yang berasingan:

  • Pertanyaan awal untuk mendapatkan semua UserRoles.
  • Pertanyaan tambahan untuk setiap UserRole untuk mendapatkan UsersInRole yang berkaitan.

Punca Berbilang Pertanyaan

NHibernate menggunakan pengambilan kelompok untuk mendapatkan semula entiti berkaitan dengan cekap. Walau bagaimanapun, apabila bilangan entiti berkaitan melebihi saiz kelompok, pertanyaan tambahan diperlukan. Dalam senario di atas, saiz kelompok mungkin terlalu kecil untuk mendapatkan semula semua UsersInRole dalam satu pertanyaan.

Penyelesaian: Laraskan Saiz Kelompok

Untuk menangani isu ini, anda boleh melaraskan saiz kelompok yang digunakan untuk pengambilan yang bersemangat. Dengan menetapkan saiz kelompok yang lebih besar, NHibernate akan cuba mengambil lebih banyak entiti berkaitan dalam satu pertanyaan. Ini boleh mengurangkan bilangan hits pangkalan data dengan ketara.

Ubah suai pemetaan seperti berikut:

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        ...
        HasManyToMany(x => x.UsersInRole)
        ...
        .BatchSize(25);
    }
}
Salin selepas log masuk

Menetapkan saiz kelompok kepada 25 akan mengarahkan NHibernate untuk mengambil maksimum 25 entiti UsersInRole bagi setiap pertanyaan . Ini mungkin menyebabkan kurang pertanyaan dan prestasi yang dipertingkatkan.

Pertimbangan Tambahan

  • Menggunakan fetch="fetch" dalam HQL juga boleh menghasilkan berbilang pertanyaan pangkalan data. Untuk mengelakkan perkara ini, gunakan fetch="select" sebaliknya.
  • Pengambilan yang bersemangat boleh meningkatkan penggunaan memori dengan ketara. Gunakannya dengan bijak dan hanya apabila perlu.

Atas ialah kandungan terperinci Mengapa NHibernate QueryOver's Eager Loading Menyebabkan Berbilang Pertanyaan Pangkalan Data?. 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