Apakah cache Tingkat Pertama dan Kedua di Hibernate?

245

Adakah yang bisa menjelaskan dengan kata-kata sederhana apa caching Tingkat Pertama dan Kedua di Hibernate?

Suhair
sumber

Jawaban:

300

1.1) Cache tingkat pertama

Cache tingkat pertama selalu Berhubungan dengan objek Sesi . Hibernate menggunakan cache ini secara default. Di sini, ia memproses satu transaksi demi satu, berarti tidak akan memproses satu transaksi berkali-kali. Terutama itu mengurangi jumlah query SQL yang diperlukan untuk menghasilkan dalam transaksi yang diberikan. Itu bukannya memperbarui setelah setiap modifikasi dilakukan dalam transaksi, itu memperbarui transaksi hanya di akhir transaksi.

1.2) Cache tingkat kedua

Cache tingkat kedua selalu dikaitkan dengan objek Session Factory . Saat menjalankan transaksi, di antara itu memuat objek di tingkat Session Factory, sehingga objek-objek itu akan tersedia untuk seluruh aplikasi, tidak terikat pada pengguna tunggal. Karena objek sudah dimuat dalam cache, setiap kali objek dikembalikan oleh kueri, pada saat itu tidak perlu pergi untuk transaksi database. Dengan cara ini cache level kedua berfungsi. Di sini kita dapat menggunakan cache level kueri juga.

Dikutip dari: http://javabeat.net/introduction-to-hibernate-caching/

Dennis C
sumber
38
+1 untuk memetakan Cache Tingkat Pertama dengan Objek Sesi dan Cache Tingkat Kedua dengan Objek Pabrik Sesi. saya bahkan tidak perlu melanjutkan membaca.
Mahes
1
Cache tingkat ke-1. dalam banyak kasus itu tidak diperlukan, tetapi tidak ada pilihan untuk menghilangkannya. tetapi Anda harus memikirkannya sepanjang waktu ..
ses
6
@ses Anda membutuhkan cache tingkat 1 dalam banyak kasus. Kalau tidak, Anda akan memiliki masalah KINERJA BURUK seperti N + 1 query, atau tidak ada cache pre-fetch, atau permintaan sekali setiap kali Anda mengakses atribut.
Dennis C
Biasanya kita menggunakan sesi untuk periode yang sangat singkat [dan sangat direkomendasikan oleh tubuh] / sesi singkat: kita bahkan tidak menggunakan cache itu dalam periode itu. jika sesi berumur panjang maka kami lampirkan data (saat mengedit formulir misalnya) dari sesi. Tampaknya itu diperlukan hanya untuk satu skenario ketika kami mencoba menggunakan kueri-sesi-api sambil membangun beberapa permintaan-setelah-permintaan kompleks untuk sesi berumur panjang.
ses
1
@ DennisCheung: Tautannya sudah mati. Mohon perbarui dengan javabeat.net/introduction-to-hibernate-caching
NewUser
118

Ada penjelasan yang cukup bagus tentang caching tingkat pertama di blog Streamline Logic .

Pada dasarnya, caching level pertama terjadi pada basis per sesi di mana caching level kedua dapat dibagikan di beberapa sesi.

lomaxx
sumber
20
itu kata-kata sederhana di sana, saya tidak tahu mengapa mereka kesulitan menjelaskannya
BlackTigerX
hehe ... ya saya tidak begitu tahu bagaimana saya bisa menjadi jauh lebih sederhana :)
lomaxx
2
ini sebenarnya lebih jelas bagi saya. pertama adalah per sesi di mana yang kedua adalah untuk beberapa sesi, sederhana untuk saya ingat. tidak bisakah kita memilih dua kali? : D
black sensei
1
tidak ada sampel mengapa cache level 1 diperlukan. seperti bagi saya dalam banyak kasus itu tidak diperlukan sama sekali. tetapi Anda harus memikirkannya dan tentang sesi sepanjang waktu.
ses
Sudah 11 tahun sejak jawaban ini dan sayangnya tautannya tidak ada sekarang. Tetapi saya menemukan kontennya di halaman web arsipnya
Golu
105

Berikut ini beberapa penjelasan dasar cache hibernate ...

Cache tingkat pertama dikaitkan dengan objek "sesi". Cakupan objek cache adalah sesi. Setelah sesi ditutup, objek yang di-cache hilang selamanya. Cache tingkat pertama diaktifkan secara default dan Anda tidak dapat menonaktifkannya. Saat kami meminta entitas untuk pertama kalinya, ia diambil dari basis data dan disimpan dalam cache tingkat pertama yang terkait dengan sesi hibernasi. Jika kita query objek yang sama lagi dengan objek sesi yang sama, itu akan diambil dari cache dan tidak ada query sql akan dieksekusi. Entitas yang dimuat dapat dihapus dari sesi menggunakan evict()metode. Pemuatan entitas ini selanjutnya akan membuat panggilan basis data jika telah dihapus menggunakan evict()metode. Cache seluruh sesi dapat dihapus menggunakan clear()metode. Ini akan menghapus semua entitas yang disimpan dalam cache.

Cache tingkat kedua terpisah dari cache tingkat pertama yang tersedia untuk digunakan secara global dalam lingkup sesi pabrik. cache level kedua dibuat dalam lingkup sesi pabrik dan tersedia untuk digunakan dalam semua sesi yang dibuat menggunakan pabrik sesi tertentu. Ini juga berarti bahwa setelah sesi pabrik ditutup, semua cache yang terkait dengannya mati dan manajer cache juga ditutup. Setiap kali sesi hibernasi mencoba memuat suatu entitas, tempat pertama yang dicarinya adalah salinan entitas yang di-cache dalam cache tingkat pertama (terkait dengan sesi hibernasi tertentu). Jika salinan entitas yang di-cache hadir dalam cache tingkat pertama, itu dikembalikan sebagai hasil dari metode pemuatan. Jika tidak ada entitas yang di-cache dalam cache level pertama, maka cache level kedua dicari entitas yang di-cache. Jika cache level kedua telah di-cache entitas, itu dikembalikan sebagai hasil dari metode memuat. Tapi, sebelum mengembalikan entitas, ia disimpan dalam cache tingkat pertama juga sehingga permohonan selanjutnya untuk memuat metode entitas akan mengembalikan entitas dari cache tingkat pertama itu sendiri, dan tidak perlu lagi pergi ke cache tingkat kedua lagi. Jika entitas tidak ditemukan dalam cache level pertama dan cache level kedua juga, maka query database dieksekusi dan entitas disimpan di kedua level cache, sebelum kembali sebagai respons dariload() metode.

Creditto
sumber
2
Penjelasan yang bagus! Jika Anda bisa menggambar beberapa diagram urutan itu akan luar biasa !!!
Adelin
penjelasan menyeluruh dan baik
Manish
1
Jika Anda ingin merevisi apa yang sudah Anda ketahui, maka dua jawaban di atas oleh Dennis C dan Iomaxx sangat bagus, sangat ringkas, dan mudah diingat. Namun, jika Anda mencari penjelasan tentang perbedaan ketika Anda belum mengetahuinya, jawaban ini jauh lebih baik!
The Student Soul
Penjelasan hebat !!
blu3
17

Ini adalah pertanyaan yang sangat umum, jadi jawaban ini didasarkan pada artikel yang saya tulis di blog saya.

Cache tingkat pertama

Hibernate mencoba menunda Konteks Persistence memerah hingga saat terakhir yang mungkin. Seperti yang saya jelaskan dalam artikel ini , strategi ini secara tradisional dikenal sebagai penulisan transaksional.

Tulis-balik lebih terkait dengan pembilasan Hibernate daripada transaksi logis atau fisik. Selama transaksi, flush dapat terjadi beberapa kali.

masukkan deskripsi gambar di sini

Perubahan memerah hanya terlihat untuk transaksi database saat ini. Sampai transaksi saat ini dilakukan, tidak ada perubahan yang terlihat oleh transaksi bersamaan lainnya.

Karena cache tingkat pertama, Hibernate dapat melakukan beberapa optimasi:

Cache tingkat kedua

Solusi caching yang tepat harus menjangkau beberapa Sesi Hibernate dan itulah sebabnya Hibernate mendukung cache level kedua tambahan juga.

Cache tingkat kedua terikat pada siklus hidup SessionFactory, jadi cache hanya dihancurkan ketika SessionFactoryditutup (biasanya ketika aplikasi dimatikan). Cache tingkat kedua terutama berorientasi pada entitas, meskipun mendukung juga solusi caching permintaan opsional.

Untuk lebih jelasnya, lihat artikel ini .

Vlad Mihalcea
sumber
3

secara default, NHibernate menggunakan caching level pertama yang berbasis Session Object. tetapi jika Anda menjalankan dalam lingkungan multi-server, maka cache tingkat pertama mungkin tidak terlalu skalabel bersama dengan beberapa masalah kinerja. itu terjadi karena fakta bahwa ia harus melakukan perjalanan yang sangat sering ke database karena data didistribusikan melalui beberapa server. dengan kata lain NHibernate menyediakan cache L1 dalam-proses dasar, tidak terlalu canggih di luar kotak. Namun, ini tidak menyediakan fitur yang harus dimiliki oleh solusi caching untuk memiliki dampak penting pada kinerja aplikasi.

jadi pertanyaan dari semua masalah ini adalah penggunaan cache L2 yang dikaitkan dengan objek pabrik sesi. ini mengurangi perjalanan yang memakan waktu ke database sehingga pada akhirnya meningkatkan waktu respons aplikasi.

Ravian
sumber
1

Tembolok Tingkat Pertama

Objek sesi menyimpan data cache tingkat pertama. Ini diaktifkan secara default. Data cache tingkat pertama tidak akan tersedia untuk seluruh aplikasi. Aplikasi dapat menggunakan banyak objek sesi.

Cache Tingkat Kedua

Objek SessionFactory menyimpan data cache level kedua. Data yang disimpan dalam cache level kedua akan tersedia untuk seluruh aplikasi. Tetapi kita perlu mengaktifkannya secara eksplisit.

Looser
sumber
-4

Dalam cache level kedua, file domain hbm bisa dari key yang bisa berubah dan bernilai false. Misalnya, Di kelas domain ini beberapa durasi dalam sehari tetap konstan sebagai kebenaran universal. Jadi, itu dapat ditandai sebagai tidak berubah di seluruh aplikasi.

Prakash Bayas
sumber