- Ya,
@BatchSize
dimaksudkan untuk digunakan dengan asosiasi malas. - Hibernate akan tetap mengeksekusi beberapa pernyataan di sebagian besar situasi, meskipun jumlah proxy/koleksi yang tidak diinisialisasi kurang dari ukuran batch yang ditentukan. Lihat jawaban ini untuk lebih jelasnya. Selain itu, kueri yang lebih ringan dibandingkan dengan kueri yang lebih kecil dapat berkontribusi positif pada throughput sistem secara keseluruhan.
@BatchSize
pada tingkat kelas berarti ukuran batch yang ditentukan untuk entitas akan diterapkan untuk semua@*ToOne
asosiasi malas dengan entitas itu. Lihat contoh denganPerson
entitas dalam dokumentasi.
Pertanyaan/jawaban tertaut yang Anda berikan lebih memperhatikan kebutuhan pengoptimalan dan pemuatan lambat secara umum. Mereka berlaku di sini juga tentu saja, tetapi mereka tidak terkait dengan pemuatan batch saja, yang merupakan salah satu pendekatan yang mungkin.
Hal penting lainnya berkaitan dengan pemuatan bersemangat yang disebutkan dalam jawaban tertaut dan yang menunjukkan bahwa jika properti selalu digunakan maka Anda mungkin mendapatkan kinerja yang lebih baik dengan menggunakan pemuatan bersemangat. Ini secara umum tidak benar untuk koleksi dan dalam banyak situasi untuk asosiasi satu-satu.
Misalnya, Anda memiliki entitas berikut yang bs
dan cs
adalah selalu digunakan saat A
digunakan.
public class A {
@OneToMany
private Collection<B> bs;
@OneToMany
private Collection<C> cs;
}
Memuat bs
. dengan penuh semangat dan cs
jelas menderita masalah pemilihan N+1 jika Anda tidak bergabung dengan mereka dalam satu kueri. Tetapi jika Anda menggabungkannya dalam satu kueri, misalnya seperti:
select a from A
left join fetch a.bs
left join fetch a.cs
lalu Anda membuat produk Cartesian lengkap antara bs
dan cs
dan mengembalikan count(a.bs) x count(a.cs)
baris dalam hasil yang ditetapkan untuk setiap a
yang dibaca satu per satu dan dirangkai menjadi entitas A
dan koleksi bs
their mereka dan cs
.
Pengambilan batch akan sangat optimal dalam situasi ini, karena Anda terlebih dahulu membaca A
s, lalu bs
lalu cs
, menghasilkan lebih banyak kueri tetapi dengan jumlah total data yang ditransfer dari database jauh lebih sedikit. Selain itu, kueri terpisah jauh lebih sederhana daripada kueri besar dengan gabungan dan lebih mudah untuk dieksekusi dan dioptimalkan basis data.