Cache hibernate
Caching adalah semua tentang optimalisasi kinerja aplikasi dan terletak di antara aplikasi dan database untuk menghindari beberapa akses database dan memungkinkan aplikasi kritis kinerja berkinerja lebih baik.
Caching penting untuk hibernasi, dan mengadopsi skema caching multi-level yang dijelaskan di bawah ini:
Cache Level 1:
Cache level pertama adalah cache sesi, yang merupakan cache wajib, dan semua permintaan melalui itu harus dilewati. Objek sesi terus -menerus ditenagai oleh objek sebelum mengirimkannya ke database.
Jika beberapa pembaruan dikeluarkan, Hibernate berupaya menunda pembaruan selama mungkin untuk mengurangi jumlah pembaruan yang dikeluarkan pernyataan SQL. Jika Anda menutup sesi, semua objek yang di -cache akan hilang, baik persisten, atau diperbarui dalam database.
Cache Level 2:
Cache Level 2 adalah opsional dan cache Level 1 yang akan selalu dicari sebelum upaya untuk menemukan cache Level 2 objek. Cache tingkat kedua dapat dikonfigurasi berdasarkan per-kelas dan per kategori, terutama bertanggung jawab atas objek yang di-cache dalam sesi.
Cache pihak ketiga mana pun dapat menggunakan hibernate. Antarmuka org.hibernate.cache.cacheprovider menyediakan, dan perlu untuk mengimplementasikan implementasi cache pegangan untuk menyediakan hibernate.
Cache Level Kueri:
Hibernate juga mengimplementasikan integrasi ketat dari hasil query set cache dan level 2 cache.
Ini adalah fitur opsional yang membutuhkan dua cache fisik tambahan untuk menyimpan hasil kueri yang di -cache dan daerah ketika tabel terakhir diperbarui. Ini hanya sangat berguna untuk kueri yang sering berjalan dengan parameter yang sama.
Cache Level 2:
Hibernate menggunakan cache Level 1, secara default, Anda tidak melakukan apa pun dengan cache Level 1. Mari kita langsung ke cache tingkat kedua opsional. Tidak semua kelas mendapat manfaat dari caching, jadi penting untuk menonaktifkan cache Level 2.
Hibernate level 2 cache diatur ke dua langkah. Pertama, Anda harus memutuskan strategi konkurensi mana yang akan digunakan. Setelah ini, Anda dapat mengonfigurasi cache kedaluwarsa dan menggunakan cache untuk memberikan atribut cache fisik.
Strategi konkurensi:
Kebijakan konkurensi adalah mediator yang bertanggung jawab untuk menyimpan item data dalam cache dan mengambilnya dari cache. Jika Anda ingin mengaktifkan caching Level 2, Anda harus memutuskan kebijakan konkurensi cache mana yang akan digunakan untuk setiap kelas dan koleksi yang persisten.
Transaksional: Menggunakan strategi ini untuk membaca data terutama untuk mencegah transaksi bersamaan dari data yang sudah ketinggalan zaman sangat penting dalam kasus pembaruan yang jarang terjadi.
Read-Write: Sekali lagi menggunakan strategi ini pembacaan utama data sangat penting untuk mencegah transaksi bersamaan dari data basi dalam kasus pembaruan yang jarang terjadi.
Nonstrict-Read-Write: Strategi ini tidak menjamin konsistensi antara cache dan database. Dengan strategi ini, kuncinya adalah tidak memperhatikan jika data jarang berubah dan kemungkinan data basi harus basi.
Baca-saja: Kebijakan konkurensi cocok untuk data dan tidak akan pernah berubah. Data yang digunakan hanya untuk referensi.
Jika kami ingin menggunakan cache tingkat kedua sebagai kelas karyawan kami, mari kita tambahkan elemen pemetaan yang diperlukan untuk memberi tahu Hibernate untuk menggunakan kebijakan cache yang dapat dibaca dan dapat ditulis untuk contoh karyawan.
<? XML Versi = "1.0" encoding = "utf-8"?> <! Doctype hibernate-mapping public "-// hibernate/hibernate pemetaan dtd // en" "http://www.hibernate.org/dtd/hibernate-papping-3.0 <meta attribute = "class-description"> Kelas ini berisi detail karyawan. </meta> <cache usage="read-write"/> <id name="id" type="int" column="id"> <generator/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </belas> </hibernate-Mapping>
Properti penggunaan = "baca-tulis" memberi tahu Hibernate untuk menggunakan cache yang ditentukan oleh kebijakan konkurensi baca-tulis.
Penyedia cache:
Setelah mempertimbangkan kebijakan konkurensi kelas kandidat cache Anda, langkah selanjutnya adalah memilih penyedia cache. Pasukan Hibernate Memilih cache untuk melayani seluruh aplikasi.
Cache disediakan dalam file konfigurasi hibernate.cfg.xml yang ditentukan. Pilih Ehcache sebagai penyedia cache tingkat kedua:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- Assume students is the database name --> <property name="hibernate.connection.url"> jdbc:mysql://localhost/test </property> <property name = "hibernate.connection.userName"> root </propt> <properti name = "hibernate.connection.password"> root123 </property> <name properti = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheProvider </Property> <! resource = "emplinge.hbm.xml"/> </sion-factory> </hibernate-configuration>
Sekarang, Anda perlu menentukan sifat area cache. EHCACHE memiliki file konfigurasi sendiri ehcache.xml, di aplikasi di ClassPath. Di ehcache.xml, konfigurasi cache kelas karyawan mungkin terlihat seperti ini:
<diskstore path = "java.io.tmpdir"/> <defaultCachemaxElementsInmemory = "1000" abadi = "false" timeToidleseconds = "120" timetoliveseconds = "120" overflowTodisk = "true"/<cache name = "karyawan" maxElementsInmemory = "500" Eternal = "true" timeToidleseconds = "0" timeToliveseconds = "0" overflowTodisk = "false"/>
Itu saja, sekarang memungkinkan cache sekunder kelas karyawan dan hibernate sekarang memiliki cache sekunder, setiap kali menjelajah ke karyawan atau ketika karyawan dimuat oleh pengidentifikasi.
Anda harus menganalisis semua kelas Anda dan memilih strategi caching yang sesuai untuk setiap kelas. Terkadang, cache sekunder dapat menurunkan kinerja aplikasi. Jadi disarankan untuk aplikasi benchmark yang tidak memungkinkan caching untuk pertama kalinya, yang sangat cocok untuk caching dan memeriksa kinerja. Jika cache tidak meningkatkan kinerja sistem, tidak ada artinya untuk membuat jenis cache apa pun.
Cache Level Kueri:
Menggunakan cache kueri, itu harus diaktifkan terlebih dahulu di file konfigurasi properti hibernate.cache.use_query_cache = "true". Jika properti ini diatur ke true, biarkan hibernate membuat cache yang diperlukan dalam memori untuk menyimpan kueri dan set pengidentifikasi.
Selanjutnya, menggunakan Cache Query, Anda dapat menggunakan metode SetCacheable (Boolean) dari kelas kueri. Misalnya:
Session session = sessionFactory.opensession (); kueri kueri = session.createqueery ("dari karyawan"); query.setCeable (true); daftar pengguna = query.list (); sessionfactory.closesession ();Hibernate juga mendukung dukungan cache berbutir yang sangat halus melalui konsep area cache. Cache adalah bagian dari cache yang diberi nama.
Sesi sesi = sessionfactory.opensession (); kueri kueri = session.createqueery ("dari karyawan"); query.setCacheable (true); query.setCacheregion ("karyawan"); daftar pengguna = query.list (); sessionfactory.closession ();Kode ini menggunakan metode untuk memberi tahu Hibernate untuk menyimpan dan menemukan pertanyaan tentang karyawan di cache.
SQL asli Hibernate
Anda dapat menggunakan SQL asli untuk mengekspresikan kueri basis data. Jika Anda ingin menggunakan fungsi khusus basis data, seperti permintaan permintaan atau menghubungkan kata kunci di Oracle. Hibernate3.x memungkinkan penggunaan pernyataan SQL tulisan tangan, termasuk prosedur tersimpan, semua pembuatan, pembaruan, hapus dan operasi muat.
Aplikasi akan membuat kueri SQL asli (pada antarmuka sesi) dari sesi membuat metode:):
SQLQUERY PUBLIK CREOKSQLQUERY (String SQLSTRING) melempar HibernateException
Saat melewati kueri SQL untuk membuat metode CreateSQLQuery (), Anda dapat menggunakan metode addEntity () yang terkait dengan entitas hibernate yang ada, atau hasil skalar menggunakan metode addEntity (), addJoin (), dan metode addscalar ().
Kueri Skalar:
Kueri SQL paling dasar adalah mendapatkan daftar skalar (nilai numerik) dari satu atau lebih tabel. Berikut adalah nilai -nilai sintaksis menggunakan skalar SQL asli:
String sql = "pilih first_name, gaji dari karyawan"; sqlQuery query = session.createSqlQuery (sql); query.setresulttransformer (criteria.alias_to_entity_map); daftar hasil = query.list ();
Kueri entitas:
Kueri di atas semua nilai skalar mengembalikan, yaitu data "telanjang" yang dikembalikan dari hasil. Berikut ini adalah sintaks untuk mendapatkan objek entitas secara keseluruhan dari kueri SQL asli melalui metode addentity ().
String sql = "Pilih * dari karyawan"; sqlQuery query = session.createSqlQuery (sql); query.addentity (karyawan.class); daftar hasil = query.list ();
Bernama SQL Query:
Berikut ini adalah sintaks untuk mendapatkan objek entitas dari kueri SQL asli dan menggunakan kueri SQL bernama melalui metode addentity ().
String sql = "Pilih * dari karyawan di mana id =: emplingee_id"; sqlQuery query = session.createSqlQuery (sql); query.addentity (karyawan.class); query.setParameter ("usaha kerja", 10); daftar hasil = query.list (); Contoh SQL Asli:
Pertimbangkan kelas pojo berikut:
karyawan kelas publik {private int id; Private String FirstName; Private String LastName; gaji int pribadi; pegawai publik () {} pegawai publik (string fname, string lname, int gaji) {this.firstname = fname; this.lastname = lname; this.salary = gaji; } public int getId () {return id; } public void setid (int id) {this.id = id; } public String getFirstName () {return firstName; } public void setFirstName (String first_name) {this.firstname = first_name; } public String getLastName () {return lastName; } public void setLastName (string last_name) {this.lastname = last_name; } public int getSalary () {return gaji; } public void setSalary (int gaji) {this.salary = gaji; }}Mari kita buat tabel karyawan berikut untuk menyimpan objek karyawan:
Buat tabel karyawan (id int not null auto_increment, first_name varchar (20) default null, last_name varchar (20) default null, gaji int default null, kunci utama (id));
Berikut ini akan dipetakan file.
<? XML Versi = "1.0" encoding = "utf-8"?> <! Doctype hibernate-mapping public "-// hibernate/hibernate pemetaan dtd // en" "http://www.hibernate.org/dtd/hibernate-papping-3.0 <meta attribute = "class-description"> Kelas ini berisi detail karyawan. </meta> <id name="id" type="int" column="id"> <generator/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class></hibernate-mapping>
Akhirnya, kami akan membuat metode utama () dari kelas aplikasi untuk dijalankan, dan kami akan menggunakan aplikasi kueri SQL asli:
impor java.util.*; impor org.hibernate.hibernateException; impor org.hibernate.Session; import org.hibernate.Transaction;import org.hibernate.SessionFactory;import org.hibernate.SQLQuery;import org.hibernate.Criteria;import org.hibernate.Hibernate;import org.hibernate.cfg.Configuration;public class ManageEmployee { private static SessionFactory factory; public static void main (string [] args) {try {factory = new configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ("Gagal membuat objek SesionFactory." + Ex); Lempar pengecualian baruinitializerError (EX); } Manajemen Me = Manajemen baru (); / * Tambahkan beberapa catatan karyawan dalam database */ integer empid1 = me.addemployee ("zara", "ali", 2000); Integer empid2 = me.addemployee ("daisy", "das", 5000); Integer empid3 = me.addemployee ("John", "Paul", 5000); Integer empid4 = me.addemployee ("mohd", "yasee", 3000); / * Daftar karyawan dan gaji mereka menggunakan skalar kueri */ me.listemployeesscalar (); / * Daftar informasi karyawan lengkap menggunakan kueri entitas */ me.listempleeesentity (); } / * Metode untuk membuat karyawan dalam database * / public integer addEmployee (string fname, string lname, int gaji) {session session = factory.opensession (); Transaksi tx = null; Integer Pegawai = NULL; coba {tx = session.begintransaction (); Karyawan Karyawan = Karyawan Baru (nama, lname, gaji); karyawan = (integer) session.save (karyawan); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); } mengembalikan karyawan; } / * Metode untuk membaca semua karyawan menggunakan skalar kueri * / public void listempleeessCalar () {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); String sql = "pilih first_name, gaji dari karyawan"; SqlQuery kueri = session.createSqlQuery (sql); query.setresultTransformer (criteria.alias_to_entity_map); Daftar data = query.list (); untuk (objek objek: data) {peta row = (peta) objek; System.out.print ("Nama Depan:" + row.get ("first_name")); System.out.println (", gaji:" + row.get ("gaji")); } tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }} / * Metode untuk membaca semua karyawan menggunakan kueri entitas * / public void listempleeesEntity () {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); String sql = "pilih * dari karyawan"; SqlQuery kueri = session.createSqlQuery (sql); query.addentity (karyawan.class); Daftar karyawan = query.list (); untuk (iterator iterator = karyawan.iterator (); iterator.hasnext ();) {karyawan karyawan = (karyawan) iterator.next (); System.out.print ("Nama Depan:" + karyawan.getFirstName ()); System.out.print ("Nama Belakang:" + karyawan.getLastName ()); System.out.println ("Gaji:" + karyawan.getSalary ()); } tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }}} Kompilasi dan jalankan:
Berikut adalah langkah -langkah untuk mengkompilasi dan menjalankan aplikasi di atas. Pastikan jalur dan ClassPath diatur dengan tepat sebelum menyusun dan mengeksekusi.
Jalankan file biner manajemen kerja untuk menjalankan program.
Hasil berikut akan diperoleh dan catatan akan dibuat di tabel karyawan.
$ java manajemen
......VARIOUS LOG MESSAGES WILL DISPLAY HERE.........First Name: Zara, Salary: 2000First Name: Daisy, Salary: 5000First Name: John, Salary: 5000First Name: Mohd, Salary: 3000First Name: Zara Last Name: Ali Salary: 2000First Name: Daisy Last Name: Das Salary: 5000First Name: John Last Name: Paul Salary: 5000First Name: Mohd Nama Belakang: Gaji Yasee: 3000
Jika Anda memeriksa tabel karyawan, itu harus mencatat bahwa ia memiliki:
mysql> pilih * dari karyawan;
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------