Artikel ini menjelaskan teknologi caching dalam kerangka hibernasi. Bagikan untuk referensi Anda, sebagai berikut:
Cache dari kerangka hibernate dibagi menjadi cache sesi dan cache sesi, juga dikenal sebagai cache level 1 dan level 2 cache.
Cache Level 1:
Cache Level 1 adalah cache tingkat sesi, yang memiliki siklus hidup yang pendek, sesuai dengan sesi, dikelola oleh hibernate, dan merupakan cache selebar transaksi. Ketika program memanggil metode Sesi Load () Metode, GET () Metode, Simpan (), metode saveorupdate (), update () metode atau metode antarmuka kueri, hibernate akan cache objek entitas; Ketika objek entitas ditanyakan melalui metode muat () atau get (), hibernate pertama -tama akan diminta dalam cache. Hanya ketika objek entitas tidak dapat ditemukan, Hibernate akan mengeluarkan pernyataan SQL untuk meminta dalam database, sehingga meningkatkan efisiensi penggunaan Hibernate.
Misalnya:
Paket com.xqh.util; impor org.hibernate.Session; import com.xqh.model.user; tes kelas publik {public static void main (string [] args) {session session = null; coba {session = hibernateutil.getSession (); // dapatkan sesionsion.begintransaction (); // Aktifkan Transaction System.out.println ("Kueri Pertama:"); Pengguna pengguna = (user) session.get (user.class, integer baru (1)); System.out.println ("Nama pengguna:" + user.getName ()); System.out.println ("kueri kedua:"); user user1 = (user) session.get (user.class, 1); System.out.println ("User1 = (User) Sesi. user1.getName ()); session.getTransaction (). commit ();} catch (exception e) {e.printstacktrace (); // kesalahan akan mengembalikan kembali transaction session.getTransaction (). rollback ();} akhirnya {// tutup sesi hibernateutil.closession (sessi);Ketika program pertama -tama memeriksa objek pengguna melalui metode GET (), Hibernate akan mengeluarkan pernyataan SQL untuk meminta permintaan. Pada saat ini, Hibernate melakukan cache tingkat pertama pada objek penggunanya; Saat menanyakan metode get () lagi, Hibernate tidak akan mengeluarkan pernyataan SQL karena nama pengguna sudah ada di cache tingkat pertama. Hasil menjalankan program:
Kueri Pertama: Hibernate: selectUser0_.id as ID0_0_, user0_.name as name0_0_, user0_.sex as sex0_0_ fromtb_user_info user0_ whereUser0_.id =? Username: xqhsecond Query: Username: xqh
Catatan: Siklus hidup cache tingkat pertama sesuai dengan sesi, dan tidak dibagi antar sesi. Dalam sesi yang berbeda, objek entitas di -cache dalam sesi lain tidak dapat diperoleh.
Cache Level 2:
Cache tingkat kedua adalah cache tingkat sesi, dan siklus hidupnya konsisten dengan sessionFactory. Cache sekunder dapat dibagikan di antara beberapa sesi, dan merupakan cache di seluruh proses atau kluster-lebar.
Cache Level 2 adalah plug-in cache pluggable, dan penggunaannya membutuhkan dukungan dari produk cache pihak ketiga. Dalam kerangka Hibernate, kebijakan penggunaan cache sekunder dikonfigurasi melalui file konfigurasi Hibernate.
1. Tambahkan file konfigurasi cache ehcache.xml
<eHcache> <! - Menetapkan jalur ke direktori di mana file cache .data dibuat. Jika jalurnya adalah properti sistem java. path = "java.io.tmpdir"/> <!-konfigurasi cache default. Ini akan diterapkan pada cache yang diprogram dibuat melalui CacheManager. Atribut berikut diperlukan untuk DefaultCache: MaxInMemory - menetapkan jumlah maksimum objek yang akan dibuat di Memoryeternal - menetapkan apakah elemen abadi. Jika abadi, batas waktu diabaikan dan Elementis tidak pernah kedaluwarsa. Timetoidleseconds - Mengatur waktu untuk menganggur untuk suatu elemen sebelum kedaluwarsa. Hanya digunakan daripada elemennya tidak abadi. Waktu idle sekarang - terakhir yang diakses timeTimetoliveseconds - mengatur waktu untuk hidup untuk suatu elemen sebelum kedaluwarsa. Hanya digunakan daripada elemennya tidak abadi. TTL sekarang-kreasi timeoverflowtodisk-menetapkan apakah elemen dapat meluap ke disk ketika cacheehas dalam memori mencapai batas maxInmemory .--> <defaultCachemaxElementsInmemory = "10000" everiz = "falure" overoidconds = "120" TimeToliveseccon/everernon = "falure" 120 "120" 120 "120" 120 "120" 120 "120" cache. Tambahkan pengaturan konfigurasi cache Anda di sini. Jika Anda tidak memiliki konfigurasi untuk cache Anda, peringatan akan dikeluarkan ketika TheCacheManager memulai atribut berikut diperlukan untuk DefaultCache: Nama - Atur nama cache. Ini digunakan untuk mengidentifikasi cache. Itu harus unik. Jika abadi, batas waktu diabaikan dan Elementis tidak pernah kedaluwarsa. Timetoidleseconds - Mengatur waktu untuk menganggur untuk suatu elemen sebelum kedaluwarsa. Hanya digunakan daripada elemennya tidak abadi. Waktu idle sekarang - terakhir yang diakses timeTimetoliveseconds - mengatur waktu untuk hidup untuk suatu elemen sebelum kedaluwarsa. Hanya digunakan daripada elemennya tidak abadi. TTL sekarang-kreasi timeoverflowtodisk-menetapkan apakah elemen dapat meluap ke disk ketika cacheehas dalam memori mencapai batas maxInmemory .--> <!-sampel cache bernama samplecache1 ini lebih dari 10 menit. Cache TheDisk, yang dalam konfigurasi ini akan pergi ke mana pun java.io.tmp didefinisikan pada sistem Anda. Pada sistem Linux standar ini akan menjadi /tmp "-> <cache name =" samplecache1 "maxeLementsInmemory =" 10000 "Eternal =" false "TimeToidleseconds =" 300 "TimetOliveseconds =" 600 "ELLEWTOLISK =" true " /<!-sampel cache namanya sampel namanya sampel sampel-sake kedaluwarsa.-> <name cache = "samplecache2" maxeLementsInmemory = "1000" Eternal = "true" timetoidleseconds = "0" timetoliveseconds = "0" overflowtodisk = "false"/>-> <!
2. Atur file konfigurasi Hibernate.
<!-- Enable Level 2 Cache--><property name="hibernate.cache.use_second_level_cache">true</property><!-- Specify cache product provider--><property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property><!-- Specify the entity object to which Level 2 Cache---><class-cache usage = "read-only"> </class-cache>
contoh:
Paket com.xqh.util; impor org.hibernate.Session; import com.xqh.model.user; tes kelas publik {public static void main (string [] args) {session session = null; // sesi pertama {session = hibernateutil.getSession (); session.begintransaction (); System.out.println ("kueri pertama:"); pengguna pengguna = (user) session.get (user.class, 1); System.out.println ("nama pengguna:" + user.getName (); Sesion); Sesi); {E.PrintStackTrace (); // Kesalahan akan mengembalikan Sesi Transaksi.GetTransAction (). Rollback ();} akhirnya {// Tutup objek sesi hibernateutil.closession (session);} coba {session = hibernateutil.getSession (); // Aktifkan sesi cache kedua.begintransaction (); System.out.println ("kueri kedua:"); pengguna pengguna = (user) session.get (user.class, 1); System.out.println ("name:" + uccer. Kembali Sesi Transaksi.GetTransAction (). Rollback ();} akhirnya {// Tutup objek sesi hibernateutil.closession (sesi);}}}Cache sekunder dibagi antar sesi, sehingga objek yang sama dapat dimuat dalam sesi yang berbeda. Hibernate hanya akan mengeluarkan satu pernyataan SQL. Ketika objek dimuat untuk kedua kalinya, Hibernate akan mendapatkan objek ini dari cache.
Hasil Program:
Kueri Pertama: Hibernate: selectUser0_.id as ID0_0_, user0_.name as name0_0_, user0_.sex as sex0_0_ fromtb_user_info user0_ whereUser0_.id =? Username: xqhsecond Query: Username: xqh
Untuk cache L2, beberapa data yang jarang diperbarui atau data yang direferensikan dapat digunakan, dan kinerjanya akan ditingkatkan secara signifikan saat ini. Namun, jika data yang sering diubah digunakan untuk cache L2, kinerja akan menyebabkan masalah tertentu.
Saya berharap deskripsi dalam artikel ini akan membantu pemrograman Java semua orang berdasarkan kerangka hibernasi.