Ada produk -produk populer di beranda mal online, sehingga tingkat klik produk ini sangat tinggi. Ketika pengguna mengklik produk populer, ia perlu memasukkan halaman informasi terperinci produk, seperti di Taobao. Kemudian setiap kali Anda mengklik, Anda harus pergi ke latar belakang untuk menanyakan informasi terperinci produk, dan Anda akan mengirim pernyataan SQL yang sesuai. Setiap kali Anda menyegarkan halaman terperinci, Anda juga akan mengirim pernyataan SQL. Dengan cara ini, kinerja pasti akan sangat terpengaruh. Kemudian menggunakan cache sekunder Hibernate dapat menyelesaikan masalah ini.
Beberapa orang mungkin berpikir bahwa kita dapat menggunakan pengalihan. Dengan cara ini, ketika pengguna pertama kali mengunjungi, mereka dapat mengetahui informasi dan memasukkannya ke dalam sesi. Di masa depan, setiap kali pengguna menyegarkan, mereka dapat pergi ke sesi, jadi tidak perlu meminta permintaan dalam database. Ini masuk akal, tetapi tidak dapat menyelesaikan masalah di atas, karena yang ingin kami selesaikan adalah bahwa banyak pengguna akan mengakses produk yang sama dan mengklik produk yang sama. Pengalihan hanya dapat memastikan bahwa pengguna yang sama akan mengklik atau menyegarkan. Tetapi cache sekunder dapat menyelesaikan masalah ini.
Pertama -tama mari kita jelaskan teknologi caching sekunder berdasarkan hibernate4.3 secara detail, dan kemudian membuat konfigurasi spesifik untuk proyek ini.
1. Hibernate4.3 Level 2 Cache Basic Configuration
Tidak seperti Hibernate3, paket inti Hibernate4.3 tidak memiliki kelas terkait cache. Jika kita ingin menggunakan cache sekunder, kita perlu menambahkan paket Jar yang di -cache. Dari unduhan resmi Hibernate-Release-4.3.11. Final, ada paket JAR yang diperlukan untuk cache sekunder, yang harus ditambahkan ke proyek terlebih dahulu. sebagai berikut:
Kemudian kami mengkonfigurasi konfigurasi terkait cache sekunder di hibernate.cfg.xml:
<Hibernate-Configuration> <Session-factory> <name properti = "dialect"> org.hibernate.dialect.mysqldialect </property> <properti nama = "show_sql"> Benar </prupter> <!-Konfigurasikan penyedia cache sekunder, perhatikan bahwa ini bukan paket jar yang disimpan-> <! name = "hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.ehcacheregionFactory </port> <pemetaan /> <pemetaan /> <pemetaan /> <!- kelas mana yang akan mengonfigurasi caching dukungan? Ini terutama menampilkan produk-produk populer di beranda, jadi kelas produk mendukung caching-> <class-cache usage = "read-only"/> </sion-factory> </hibernate-configuration>>
Kemudian kami membuka server Tomcat, lalu mengunjungi beranda, klik pada produk populer, dan tidak ada pernyataan SQL yang dikirim di latar belakang. Anda mungkin bertanya-tanya, apakah cache tingkat kedua yang sesederhana itu? Cukup konfigurasikan dua item ini? Bahkan, alasan mengapa cache Level 2 telah berlaku sejauh ini adalah karena ia memiliki konfigurasi default. Ada file ehcache-failsafe.xml dalam ehcache-core-2.4.3.jar di atas, yang sudah memiliki konfigurasi default. Kami akan menganalisisnya secara rinci nanti. Pertama -tama mari kita analisis strategi kueri Hibernate:
2. Hibernate4.3 Strategi Kueri
Hibernate mendukung dua metode kueri: kueri sesi dan permintaan HQL.
Ada session.save () update () delete () get () load () dan metode lain dalam sesi. Metode ini hanya beroperasi pada satu catatan, dan standarnya adalah mendukung cache Level 2 tanpa konfigurasi apa pun. Oleh karena itu: Konfigurasi hanya baca efektif untuk sesi. Jika read-only dikonfigurasi dalam cache sekunder dalam sesi, operasi sesi. Update () dan delete () keduanya akan gagal. Jika Anda ingin berhasil, Anda perlu mengkonfigurasi penulisan baca. Tetapi save () dan get () load () berhasil.
HQL: Metode ini digunakan untuk mengoperasikan beberapa catatan secara default, seperti list () dan executeUpdate () metode. Metode ini default ke konfigurasi cache sekunder termasuk read-only tidak valid. HQL's List () kueri beberapa catatan, langsung meminta database, dan menyerahkan hasil kueri ke cache sekunder, yang memfasilitasi panggilan get () dan muat (). ExecuteUpdate tidak mendukung caching sekunder, dan juga secara langsung diperbarui ke database. Hibernate akan memastikan bahwa database dan cache disinkronkan. Catatan: HQL tidak memiliki metode simpan (). Jika Anda perlu memasukkan data, Anda hanya dapat menghubungi metode session.save ().
[Catatan]: Cache tingkat pertama (ada secara default) di Hibernate juga disebut cache tingkat sesi, tidak digunakan untuk meningkatkan kinerja, tetapi untuk menangani transaksi; Cache tingkat kedua adalah cache sessionfactory, yang berlaku untuk semua sesi, dan siklus hidupnya sama dengan sessionFactory (sessionFactory adalah singleton dan akan dibuat ketika proyek dimulai).
Untuk strategi kueri tertentu, mari kita lihat gambar berikut:
【Catatan】: Jika teks gambar terlalu kecil, Anda dapat menyeret gambar ke jendela baru untuk dilihat ~
Di atas adalah strategi kueri Hibernate. Mari kita terus lihat konfigurasi cache sekunder.
3. Hibernate 4.3 Level 2 Cache Konfigurasi Lanjutan
Seperti disebutkan di atas, alasan mengapa kita dapat menggunakan cache Level 2 setelah mengkonfigurasi dua item di hibernate.cfg.xml adalah karena ada konfigurasi default. Mari kita lihat konfigurasi default ini terlebih dahulu:
<ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" XSI: nonamespaceschemalocation = "../ config/ehcache.xsd"> <!-jika memori cache ovlow, itu akan disimpan untuk ditahan dengan puding. path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" : <!-- The maximum number of objects supported by memory --> eternal="false" : <!-- Whether the object is permanently valid, it is recommended to be false, so that the following two parameters will be valid --> timeToIdleSeconds="60" : <!-- The interval period of an object, the default unit adalah detik. Artinya, jika tidak ada yang menggunakan objek ini setelah 60 detik, itu akan dihancurkan di muka-> timetoliveseconds = "120": <!-Siklus hidup objek adalah detik-> overflowTodisk = "true": <!-apakah overflow ke hard disk "MAXIMUMEM-disarankan untuk menjadi benar-> Maxelementements =" DISK-DISK-DISKUSI, "DISKUSIGI," DISKUMUMUM-DISKK, MAXELOKS "DISKLOK," DISKUMUMUME, "DISKUMUMUME," DISKUMUMUME, "DISKUMUMUME," DISKUMOR "DISKLOK" DISKLOK "DISKLOK" DISKLOK "DISKLISK: MemoryStoreEvictionPolicy = "LRU": <!-Kebijakan Penggantian Objek-> /> < /ehcache>
Penjelasan yang relevan tentang konfigurasi default sudah ada di komentar di atas. Kita sekarang tahu bahwa justru karena konfigurasi default inilah cache tingkat kedua Hibernate 4.3 dapat dieksekusi dengan benar. Sekarang jika kita ingin mengkonfigurasi cache sendiri, kita perlu membuat file ehcache.xml baru di direktori src dan kemudian mengkonfigurasi ulang item konfigurasi di atas. Selanjutnya, kita perlu menguji setiap konfigurasi. Sebelum pengujian, saya akan memposting situasi yang ditampilkan di beranda dan membuat nomor. Mari kita jelaskan nanti saat menguji:
Di atas adalah bagian dari konten yang ditampilkan di halaman beranda. Hibernate telah menemukan informasi tampilan dari database dan telah ditampilkan. Kami akan memberi nomor mereka dan akan lebih mudah dianalisis ketika kami menguji cache nanti. Mari kita mulai menguji item konfigurasi cache di atas:
Tes 1: Uji jumlah objek dalam memori. Ubah konfigurasi ke situasi berikut:
<DefaultCache MaxElementsInMemory = "6" <!-Pengaturan hanya mendukung 6 cache-> abadi = "true" overflowTodisk = "false" memorysoreEvictionPolicy = "fifo": <!-first-in, first-out-> / />
Setelah konfigurasi selesai, kami restart server dan membuka halaman beranda. Karena ada 6 yang dikonfigurasi, hanya 6 catatan terakhir yang ditemukan dalam cache yang disimpan, yaitu, nomor 3-8. Kami mengklik salah satu produk dalam 3-8 untuk memasukkan halaman Detail Produk. Perhatikan bahwa konsol di latar belakang tidak menghasilkan informasi kueri apa pun, yang berarti bahwa tidak ada pernyataan SQL yang dikirim. Namun, ketika kita mengklik nomor produk 2, pernyataan SQL dikirim di latar belakang, yaitu, database ditanyakan. Kami mendukung dan mengklik produk 2 lagi, dan tidak ada pernyataan SQL yang dikirim, yang berarti telah dimasukkan ke dalam cache, tetapi cache hanya mendukung 6 data. Karena strategi penggantian objek yang dikonfigurasi adalah yang pertama, pertama, sehingga angka 3 dalam cache baru saja dihapus. Kami mengklik 3 untuk mencoba dan mengirim pernyataan SQL. Jadi tes selesai, dan eksekusi cache tingkat kedua normal.
Tes 2: Siklus hidup objek uji. Ubah konfigurasi ke situasi berikut:
<DefaultCache MaxElementsInMemory = "100" Eternal = "False" <!-Hanya dengan mencocokkan False, siklus hidup berikut dapat diatur-> TimeToidleseconds = "20" TimeTolivesEconds = "40" overflowTodisk = "false" memalseStoreEvictionPolicy = "fifo" /"
Waktu cache dikonfigurasi sebagai 40 detik, dan jika tidak ada operasi dalam 20 detik, itu akan dihapus. Karena kami telah menetapkan 100 catatan, angka 1-8 di atas semuanya ada di cache. Setelah kami mengaktifkan server, kami mengklik siapa pun, misalnya, klik nomor 8, dan tidak ada pernyataan SQL yang dikeluarkan. Biasanya, setelah 20 detik, klik nomor 8 dan kirim pernyataan SQL, menunjukkan bahwa siklus hidup yang kami konfigurasi telah berlaku. Perhatikan di sini bahwa konfigurasi tidak bisa terlalu pendek, seperti 10 detik, karena Tomcat akan membutuhkan beberapa detik untuk memulai. Jika ada lebih sedikit konfigurasi, waktu mungkin sudah habis sebelum pengujian ... maka itu tidak akan berhasil.
Tes 3: Uji apakah cache sekunder mendukung penyimpanan hard disk.
<defaultcache maxeLementsInmemory = "4" Eternal = "false" <!-Hanya dengan mengatur false, siklus hidup berikut dapat diatur-> timeToidleseconds = "100" timeToliveseconds = "200" overflowTodisk = "true" <!-hanya dengan menetapkan true dapat penyimpanan hard disk harus didukung-> memori sore-coreEviction = "hanya dengan mengatur penyimpanan hard disk yang didukung-> memori soreViTION =" hanya dengan setelyeVicy = FIFO "FIFO" FIFO /FIFODE /FIFLOWTODISK = "200"
Kami mengatur penyimpanan hard disk dukungan ke True dan mengkonfigurasi kapasitas penyimpanan maksimum cache sekunder ke 4. Mulai ulang server. Karena cache sekunder menyimpan hingga 4 catatan, itu harus diberi nomor 5-8. Mengklik 5-8 pasti tidak akan mengirim pernyataan SQL, tetapi ketika kami mengklik 1-4, kami tidak akan mengirim pernyataan SQL, karena kami telah mengatur dukungan untuk penyimpanan hard disk, Hibernate akan menyimpan hasil kueri pada hard disk, sehingga kami juga dapat mendapatkan data secara langsung tanpa mengirimkan pernyataan SQL.
Tes 4: Uji strategi penggantian cache level 2
<DefaultCache <!- FIFO telah dihilangkan dan tidak akan digunakan lagi ... LRU: algoritma yang telah diakses setidaknya (kebijakan waktu), akan mengabaikan frekuensi akses, dan yang telah diakses pada waktu yang paling banyak akan diabaikan oleh LFU: algoritma yang telah digunakan baru-baru ini (frekuensi frequency), akan diabaikan, akan diabaikan (frekuensi). -> maxeLementsInmemory = "3" abadi = "false" <!-Hanya ketika dikonfigurasi sebagai false dapat siklus hidup berikut diatur-> timeToidleseconds = "100" timetoliveseconds = "200" overflowTodisk = "false" hanya ketika dikonfigurasi sebagai benar-benar dapat didukung-"false" <!
Seperti namanya, LRU dan LFU fokus pada waktu dan frekuensi akses terakhir. Mari kita ambil LFU sebagai contoh. Sekarang kami mengatur penyimpanan maksimum ke 3 catatan, yaitu, nomor 6-8. Sekarang kami mengakses nomor 6 tiga kali, nomor 7 dua kali, nomor 8 sekali, dan tidak akan mengeluarkan pernyataan SQL. Kami mengakses nomor 7 lagi dan mengeluarkan pernyataan SQL. Sekarang nomor 7 ada di cache, nomor 8 telah dihapus karena memiliki sedikit akses. Kami dapat mengklik nomor 8 lagi untuk mengujinya, mengeluarkan pernyataan SQL, dan tes berhasil. Jika itu adalah LRU, angka 6 yang baru saja dihapus adalah nomor 6 karena nomor 6 adalah yang paling awal diakses.
Pada titik ini, saya percaya semua orang telah menguasai penggunaan cache sekunder, dan tes cache sekunder berakhir di sini. Mari kita buat konfigurasi untuk proyek mal online kami.
4. Konfigurasi aktual proyek mal online
Kami mengkonfigurasi jumlah maksimum catatan dalam cache sekunder menjadi 1000, atur siklus hidup ke 120 detik dan siklus interval hingga 60 detik. Kami mendukung penyimpanan hard disk, dan menggunakan strategi penggantian frekuensi prioritas (LFU), karena jika laju klik pengguna tinggi, itu harus ditempatkan di cache sekunder.
<ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: nonamespacesChemalocation = "../ config/ehcache.xsd"> <!-jika jungkir balik meluap, menyimpannya ke ruang hard/ehcache. <DefaultCache MaxElementsInmemory = "1000" Eternal = "False" TimeToidleseconds = "60" TimeToliveseconds = "120" overflowTodisk = "true" memoreseevictionPolicy = "lfu" /> </hcache>
Nah, dalam kombinasi dengan proyek mal online, konfigurasi dan penggunaan cache tingkat kedua Hibernate 4.3 diperkenalkan.
Alamat asli: http://blog.csdn.net/eson_15/article/details/51405911
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.