Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara kerja Hibernate Batch insert?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel 5 Fasih:Bagaimana cara mendapatkan sql mentah yang sedang dieksekusi? (dengan data terikat)

  2. Apakah ada cara untuk mengambil ID peningkatan otomatis dari pernyataan yang disiapkan

  3. Contoh Pernyataan JDBC – Sisipkan Batch, Perbarui, Hapus

  4. Cara yang lebih baik untuk menjalankan beberapa perintah MySQL menggunakan skrip shell

  5. MySQL ONLY IN() klausa yang setara