Artikel ini menganalisis secara rinci penggunaan Hibernate untuk mengelola operasi Sesi dan batch. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
Hibernasi mengelola Sesi
Hibernate sendiri menyediakan tiga metode pengelolaan objek Sesi ① Siklus hidup objek Sesi terikat pada thread lokal ② Siklus hidup objek Sesi terikat pada transaksi JTA ③ Program delegasi Hibernate mengelola siklus hidup objek Sesi
Dalam file konfigurasi Hibernate, atribut hibernate.current_session_context_class digunakan untuk menentukan metode manajemen Sesi.
① thread: Siklus hidup objek Sesi terikat ke thread lokal ② jta*: Siklus hidup objek Sesi terikat ke transaksi JTA ③ dikelola: Program delegasi Hibernasi untuk mengelola siklus hidup objek Sesi
Siklus hidup objek Session terikat pada thread lokal:
Jika nilai atribut hibernate.current_session_context_class dari file konfigurasi Hibernate diatur ke thread, Hibernate akan mengelola Sesi dengan cara yang terikat pada thread lokal.
Hibernate mengikat Sesi ke thread lokal sesuai dengan aturan berikut:
Saat thread (utas) memanggil metode getCurrentSession() objek SessionFactory untuk pertama kalinya, metode ini akan membuat objek Session (sessionA) baru, mengikat objek ke threadA, dan mengembalikan sesi ketika threadA memanggil objek SessionFactory lagi Saat menggunakan metode getCurrentSession(), metode ini akan mengembalikan objek sessionA. Ketika threadA mengirimkan transaksi yang terkait dengan objek sessionA, Hibernate akan otomatis di-flush Cache objek sessionA, lalu komit transaksi dan tutup sesi sesuai keinginan. Ketika threadA membatalkan transaksi yang terkait dengan objek sessionA, objek sessionA juga akan ditutup secara otomatis. Jika threadA memanggil metode getCurrentSession() dari objek SessionFactory lagi, metode ini akan membuat objek Session (sessionB) baru dan mengikat objek tersebut ke objek tersebut. threadA. , dan kembali sesiB
Memproses data secara batch
Pemrosesan data batch mengacu pada pemrosesan data dalam jumlah besar dalam satu transaksi dan operasi batch dalam proses lapisan aplikasi.
① Melalui Sesi
② Lulus Markas Besar
③ Melalui Sesi Tanpa Kewarganegaraan
④ Melalui JDBC API----Direkomendasikan karena paling cepat
Sesi melakukan operasi batch:
Metode save() dan update() sesi akan menyimpan objek yang diproses di cache-nya sendiri. Jika objek Session digunakan untuk memproses objek persisten dalam jumlah besar, objek yang telah diproses dan tidak akan diakses lagi harus dikosongkan dari cache pada waktu yang tepat. Metode spesifiknya adalah dengan segera memanggil metode flush() untuk menyegarkan cache setelah memproses suatu objek atau sejumlah kecil objek, lalu memanggil metode clear() untuk menyimpan cache dalam cache.
Operasi pemrosesan melalui Sesi tunduk pada batasan berikut:
Jumlah pemrosesan batch tunggal JDBC perlu diatur dalam file konfigurasi Hibernate. Harus dipastikan bahwa jumlah batch pernyataan SQL yang dikirim ke database setiap kali konsisten dengan atribut ukuran batch.
Jika objek menggunakan generator pengidentifikasi "identitas", Hibernate tidak dapat melakukan operasi penyisipan batch di JDBC.
Saat melakukan operasi batch, disarankan untuk mematikan cache tingkat kedua Hibernate
Demonstrasi kode untuk memasukkan data secara batch:
Copy kodenya dan kodenya seperti berikut : Berita berita = null;
untuk(int saya = 0; saya < 10000; saya++) {
berita = Berita baru();
berita.setTitle("--" + i);
session.save(berita);
jika((i + 1) % 20 == 0) {
sesi.flush();
sesi.hapus();
}
}
Pembaruan batch: Saat melakukan pembaruan batch, jelas tidak disarankan untuk memuat semua objek ke dalam cache Sesi sekaligus dan kemudian memperbaruinya satu per satu di cache.
Gunakan kumpulan hasil yang dapat digulir org.hibernate.ScrollableResults. Objek ini sebenarnya tidak berisi objek apa pun, hanya kursor yang digunakan untuk mencari rekaman online. Hanya ketika program melintasi untuk mengakses elemen tertentu dari objek ScrollableResults, program tersebut akan memuat objek terkait dalam database.
Objek org.hibernate.ScrollableResults dikembalikan oleh metode gulir Query
Operasi batch melalui HQL:
Catatan: HQL hanya mendukung pernyataan insert dalam bentuk INSERT INTO...SELECT, tetapi tidak mendukung pernyataan insert dalam bentuk INSERT INTO...VALUES. Oleh karena itu, operasi penyisipan batch tidak dapat dilakukan menggunakan HQL
Operasi batch melalui StatelessSession:
Secara formal, penggunaan StatelessSession mirip dengan Session. Dibandingkan dengan Session, StatelessSession memiliki perbedaan sebagai berikut:
StatelessSession tidak memiliki cache, dan objek yang dimuat, disimpan, atau diperbarui melalui StatelessSession berada dalam keadaan bebas.
StatelessSession tidak berinteraksi dengan cache tingkat kedua Hibernate. Saat memanggil metode save(), update(), atau delete() StatelessSession, metode ini akan segera mengeksekusi pernyataan SQL yang sesuai, bukan hanya berencana untuk mengeksekusi satu pernyataan SQL.
StatelessSession tidak melakukan pemeriksaan kotor, jadi setelah memodifikasi properti objek Pelanggan, Anda perlu memanggil metode update() StatelessSession untuk memperbarui data dalam database.
StatelessSession tidak akan melakukan operasi cascading apa pun pada objek terkait. Objek Pelanggan dengan OID 1 dimuat dua kali melalui objek StatelessSession yang sama. Alamat memori dari dua objek yang diperoleh berbeda.
Operasi yang dilakukan oleh StatelessSession dapat ditangkap oleh pencegat Interceptor, namun akan diabaikan oleh sistem pemrosesan peristiwa Hibernate.
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.