Jawaban:
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/
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.
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.
Ini adalah pertanyaan yang sangat umum, jadi jawaban ini didasarkan pada artikel yang saya tulis di blog saya.
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.
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:
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 SessionFactory
ditutup (biasanya ketika aplikasi dimatikan). Cache tingkat kedua terutama berorientasi pada entitas, meskipun mendukung juga solusi caching permintaan opsional.
Untuk lebih jelasnya, lihat artikel ini .
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.
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.
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.