Properti hibernasi hibernate.jdbc.batch_size
adalah cara hibernasi untuk mengoptimalkan pernyataan penyisipan atau pembaruan Anda, sedangkan loop pembilasan adalah tentang kehabisan memori.
Tanpa batchsize ketika Anda mencoba untuk menyimpan pernyataan hibernate fire 1 insert entitas, jadi jika Anda bekerja dengan koleksi besar, untuk setiap pernyataan save hibernate fire 1
Bayangkan potongan kode berikut :
for(Entity e : entities){
session.save(e);
}
Di sini hibernate akan mengaktifkan 1 pernyataan insert per entitas dalam koleksi Anda. jika Anda memiliki 100 elemen dalam koleksi Anda, maka 100 pernyataan penyisipan akan diaktifkan. Pendekatan ini tidak terlalu efisien karena 2 alasan utama:
- 1) Anda meningkatkan cache level 1 secara eksponensial dan Anda mungkin akan segera menyelesaikannya dengan
OutOfMemoryException
. - 2) Anda menurunkan kinerja karena perjalanan pulang pergi jaringan untuk setiap pernyataan.
hibernate.jdbc.batch_size dan loop pembilasan memiliki 2 tujuan yang berbeda tetapi saling melengkapi.
Hibernate gunakan yang pertama untuk mengontrol berapa banyak entitas yang akan berada dalam batch. Di bawah penutup Hibernate gunakan java.sql.Statement.addBatch(...)
dan executeBatch()
metode.
Jadi hibernate.jdbc.batch_size memberitahu hibernate berapa kali ia harus memanggil addBatch()
sebelum memanggil executeBatch()
.
Jadi menyetel properti ini tidak mencegah Anda kehabisan memori.
Untuk menjaga memori, Anda harus menyiram sesi Anda secara teratur dan ini adalah tujuan dari loop pembilasan.
Saat Anda menulis :
for(Entity e : entities){
if (i % 100 == 0 && i>0) {
session.flush();
session.clear();
}
}
Anda menyuruh hibernasi untuk membersihkan dan menghapus sesi setiap 100 entitas (Anda melepaskan memori).
Jadi sekarang apa hubungan antara 2 ?
Agar optimal, Anda harus mendefinisikan jdbc.batch_size
. Anda dan parameter pembilasan Anda identik.
jika Anda menetapkan parameter flush lebih rendah dari batch_size yang Anda pilih, maka hibernate akan mem-flush sesi lebih sering sehingga akan membuat batch kecil hingga mencapai ukuran btach yang tidak efisien
ketika 2 adalah hibernasi yang sama hanya akan mengeksekusi kumpulan ukuran optimal kecuali yang terakhir jika ukuran kumpulan bukan kelipatan dari ukuran_batch Anda.
Anda dapat melihat posting untuk detail lebih lanjut tentang poin terakhir ini