1 Pengantar Ehcache
Ehcache adalah kerangka kerja caching java dalam proses murni, dengan fitur cepat dan ramping, dan merupakan cacheeprovider default di Hibernate.
Ehcache adalah cache terdistribusi Java open source yang banyak digunakan. Terutama ditujukan untuk cache universal, java ee dan wadah ringan. Ini memiliki fitur penyimpanan memori dan disk, cache loader, ekstensi cache, penangan pengecualian cache, filter servlet cache GZIP, dan mendukung REST dan SOAP API.
Ehcache awalnya dikembangkan oleh Greg Luck pada tahun 2003. Pada tahun 2009, proyek ini dibeli oleh terakota. Perangkat lunak ini masih open source, tetapi beberapa fitur utama baru (mis., Konsistensi antara restabilitas cepat) hanya dapat digunakan dalam produk komersial, seperti Enterprise Ehcache dan BigMemory. Wikimedia FoundationAnnoulsed saat ini menggunakan teknologi EHCACHE.
Singkatnya, Ehcache masih merupakan teknologi caching yang baik. Mari kita lihat bagaimana musim semi diimplementasikan dengan Ehcache.
2 Musim Semi dengan Ehcache
Hasil sistem adalah sebagai berikut:
3 Pendahuluan Konfigurasi Spesifik
Ada kombinasi bagian -bagian ini:
SRC: Kode Java, termasuk Interceptor, Calling Interface, Kelas Pengujian
src/cache-bean.xml: Konfigurasikan kacang yang sesuai dengan kelas EHCACHE, Interceptor, dan Tes, dll.
SRC/EHCACHE.XML: Informasi Konfigurasi Cache Ehcache
Webroot/Lib: Perpustakaan
4 Pendahuluan Konten Detail
4.1 SRC
4.1.1 Interceptor
Dua pencegat pertama kali dikonfigurasi dalam kode:
Interceptor pertama adalah:
com.test.ehcache.cachemethodInterceptor
Kontennya adalah sebagai berikut:
Paket com.test.ehcache; impor java.io.serializable; impor net.sf.ehcache.cache; impor net.sf.ehcache.element; impor org.aopalliance.intercept.methodInterceptor; impor org.aopalliance.inteprepor.methodinvocation; impor org.springpringpring. org.springframework.util.assert; kelas publik CachemethodInterceptor mengimplementasikan MethodInterceptor, InitializingBean {Private Cache Cache; public void setCache (cache cache) {this.cache = cache; } public CacheMethodInterceptor () {super (); } /*** mencegat metode ServiceManager dan mencari tahu apakah hasilnya ada. Jika ada, kembalikan nilai dalam cache. * Kalau tidak, kembalikan hasil kueri basis data dan masukkan hasil kueri ke dalam cache */objek publik Invoke (MethodInvocation Invocation) melempar lempar {// Dapatkan class string targetName untuk dicegat = Invocation.getThis (). GetClass (). GetName (); // Dapatkan metode kelas untuk dicegat string methodName = AVOCATION.GetMethod (). GetName (); // Dapatkan parameter metode kelas untuk dicegat objek [] argumen = invocation.getArguments (); Hasil objek; // Buat string untuk membuat tombol dalam cache string cacheKey = getCacheKey (targetName, methodName, argumen); // Dapatkan data dari elemen elemen cache = Cache.get (CacheKey); if (element == null) {// Jika tidak ada data di cache, cari non-cache, seperti database, dan masukkan yang ditemukan ke dalam cache hasil = Invocation.proed (); // menghasilkan kunci dan nilai yang akan disimpan dalam elemen cache = elemen baru (CacheKey, (serializable) hasil); System.out.println ("---- Masukkan pencarian non-cache, seperti mencari database secara langsung, memasukkannya ke dalam cache setelah mencari"); // simpan kunci dan nilai ke cache cache.put (elemen); } else {// Jika ada data di cache, cari cache system.out.println ("--- masukkan pencarian cache, jangan mencari database, mengurangi tekanan pada database"); } return element.getValue (); } /*** Metode untuk mendapatkan kunci cache. Kunci cache adalah pengidentifikasi unik dari suatu elemen dalam cache. * Termasuk nama paket + nama kelas + nama metode, seperti: com.test.service.testserviceImpl.getObject */ private string getCacheKey (string targetName, string methodName, objek [] argumen) {stringBuffer sb = stringBuffer baru (); SB.Append (TargetName) .Append ("."). Append (MethodName); if ((argumen! = null) && (argumen.length! = 0)) {for (int i = 0; i <arguments.length; i ++) {sb.append ("."). append (argumen [i]); }} return sb.toString (); } / ** * Implementasikan inisialisasi, periksa apakah cache kosong 70 * / public void afterpropertiesset () melempar Exception {assert.notnull (cache, "butuh cache. Harap gunakan setCache (cache) Buat."); }}CachemethodInterceptor digunakan untuk mencegat metode dimulai dengan "Get". Perhatikan bahwa pencegat ini pertama -tama mencegat dan kemudian menjalankan antarmuka panggilan asli.
Ada juga pencegat:
com.test.ehcache.cacheafterreturningadvice
Konten spesifik:
Paket com.test.ehcache; impor java.lang.reflect.method; impor java.util.list; impor net.sf.ehcache.cache; org.springframework.aop.afterreturningadvice; impor org.springframework.beans.factory.factory. CacheAfterReturningAdvice mengimplementasikan AfterReturningAdvice, InitializingBean {private cache cache; public void setCache (cache cache) {this.cache = cache; } public CacheAfterReTurningAdvice () {super (); } public void afterreturning (objek arg0, metode arg1, objek [] arg2, objek arg3) melempar lempar {string className = arg3.getClass (). getName (); Daftar daftar = cache.getKeys (); untuk (int i = 0; i <list.size (); i ++) {string cacheKey = string.valueof (list.get (i)); if (cacheKey.startswith (className)) {cache.remove (cacheKey); System.out.println ("----- Hapus Cache"); }}} public void afterpropertiesset () melempar pengecualian {assert.notnull (cache, "butuh cache. Silakan gunakan setCache (cache) Buat."); }}CacheAfterreturningAdvice digunakan untuk mencegat metode dimulai dengan "pembaruan". Perhatikan bahwa pencegat ini pertama -tama menjalankan antarmuka panggilan asli dan kemudian dicegat.
4.1.2 Memanggil antarmuka
Nama antarmuka adalah:
com.test.service.serviceManager
Konten spesifiknya adalah sebagai berikut:
paket com.test.service; import java.util.list; antarmuka publik serviceManager {daftar publik getObject (); public void updateObject (objek objek); }Nama kelas implementasi adalah:
com.test.service.serviceManagerImpl
Konten spesifiknya adalah sebagai berikut:
package com.test.service;import java.util.ArrayList;import java.util.List;public class ServiceManagerImpl implements ServiceManager { @Override public List getObject() { System.out.println("----ServiceManager: This element does not exist in the cache cache, look up the database, and put it in the cache!"); kembali nol; } @Override public void updateObject (objek objek) {System.out.println ("---- ServiceManager: Objek diperbarui, dan semua cache yang dihasilkan oleh kelas ini akan dihapus!"); }}4.1.3 Kelas Tes
Nama kelas tes adalah:
com.test.service.testmain
Konten spesifiknya adalah:
package com.test.service;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestMain { public static void main(String[] args) { String cacheString = "/cache-bean.xml"; ApplicationContext Context = new ClassPathXMLapPlicationContext (Cachestring); // Dapatkan kacang yang dihasilkan oleh proxy proxyfactory proxy untuk menghasilkan efek intersepsi ServiceManager testService = (ServiceManager) Context.getBean ("ProxyFactory"); // Pertama kali pencarian System.out.println ("===== Pencarian Pertama"); testservice.getObject (); // Kali kedua pencarian System.out.println ("===== Pencarian kedua"); testservice.getObject (); // yang kedua kalinya pencarian system.out.println ("====== Pencarian ketiga kalinya"); testservice.updateObject (null); // ketiga kalinya pencarian System.out.println ("====== Pencarian ketiga kalinya"); testservice.getObject (); }}Perhatikan di sini bahwa mendapatkan kacang diproduksi oleh proxy proxyfactory proxy, sehingga akan ada efek intersepsi.
Dapat dilihat bahwa empat panggilan diatur di kelas tes, dan perintah eksekusi adalah:
Pencarian pertama pencarian kedua pembaruan pertama pencarian ketiga
4.2 SRC/Cache-bean.xml
Cache-bean.xml digunakan untuk mengkonfigurasi kacang yang sesuai dengan kelas EHCACHE, Interceptor, dan Tes. Kontennya adalah sebagai berikut:
<? Xml Version = "1.0" encoding = "UTF-8"?> <! Doctype Beans Public "-// Spring // dtd bean // en" "http://www.springframework.org/dtd/spring-beans.dtd" <beans> <!-quote the configuration dari oance (beans> <beans> <! Name = "ConfigLocation"> <value> ehcache.xml </ value> </prop Property> </t bean> <!-Tentukan pabrik ehcache dan atur nama cache yang digunakan, yaitu, "com.tt"-> <bean id = "ehcache"> <properti nama = "cachanager"> <ref local = "cose =" ehcache "> <properti =" cachanager "> <ref local =" <name properti = "Cachename"> <value> com.tt </ value> </prop Propert> </ bean> <!-The Interceptor untuk membuat cache cache dan kueri-> <bean id = "cachemethodInterceptor"> </bean name = "cache"> <ref Local = "ehcache"/</Property> </Bean> CACHE dan Intercepe = "Ehcache"/</Property> </Bean> CACHET "> id = "CacheAfterReTurningAdvice"> <properti name = "cache"> <ref local = "ehcache" /> </prop Propert> </ bean> <!-panggil antarmuka, objek yang dicegat-> <bean id = "serviceManager" /> <masukkan interseptor untuk mengkonfirmasi pencegahan yang dipanggil di sini dan centang di sini dan chatceptcept dari interseptor, dll. com.test.ehcache.cachemethodInterceptor-> <bean id = "cachepointcut"> <!-tambahkan bagian, bagian ini adalah bagian yang ditambahkan setelah mengeksekusi metode cetak-> <nama properti = "nasihat"> <ref local = "cachemethodInterceptor" /> < /properti < /properties name = "Pola"> <> <DAFTER> /DAFTAR.> < /Property. Sesuai dengan karakter sebelumnya sekali atau beberapa kali ###* berarti sesuai dengan karakter nol sebelumnya atau beberapa kali ###/melarikan diri simbol apa pun yang digunakan dalam ekspresi reguler-> <!-.* Berarti awalan sebelumnya (termasuk nama paket), yang berarti metode getObject-> <value>.* Dapatkan. nama metode pencegat, dll., Hubungi com.test.ehcache.cacheafterreturningAdvice-> <bean id = "cachePointCutAdvice"> <name properti = "nasihat"> <ref local = "cacheafterreturningadvice" /> </prive name = "Patterns"> <Daftar> <!-. <value>.*Perbarui.*</value> </cist> </property> </ bean> <!-agen pabrik-> <bean id = "proxyfactory"> <!-deskripsi nama antarmuka panggilan-> <nama properti = "Target"> <Ref Local = "ServiceManager"/</Property> <!-Deskripsi Nama Properti Interceptor-Properti Intercepor-"Properti> </Property> </Property> </Property <! <value> CachepointCut </ value> <value> CachePointCutAdvice </value> </cist> </propert> </tobel>
Isi masing -masing kacang telah dikomentari dan dicatat bahwa tidak lupa untuk agen kacang pabrik.
4.3 SRC/EHCACHE.XML
Ehcache.xml menyimpan informasi terperinci tentang konfigurasi cache ehcache, sebagai berikut:
<? Xml Version = "1.0" encoding = "UTF-8"?> <Ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: nonamespacesCheMalocation = "http:/eHcache.org. <Diskstore Path = "d: // temp // cache"/> <defaultcache maxeLementsInmemory = "1000" Eternal = "false" TimeToidleseconds = "120" TimeToLivesEconds = "120" overflowTodisk = "true"/> <!-define cache informasi CACHE, di mana "com. name = "com.tt" maxeLementsInmemory = "10000" Eternal = "false" TimeToidleseconds = "300000" TimeToliveseconds = "600000" overflowTodisk = "true" /> < /ehcache> 600000 "
Anda dapat melihat bahwa lokasi penyimpanan penyimpanan cache diatur ke "D:/Temp/Cache", dan nama cache diatur ke "com.tt", seperti yang ditunjukkan pada gambar:
4.4 Webroot/Lib
Untuk perpustakaan Java yang diperlukan, silakan lihat gambar struktur sistem di awal, dihilangkan di sini.
5 tes
Jalankan kelas tes, dan hasil tes adalah sebagai berikut:
Melalui hasil eksekusi, kita dapat melihat:
Setelah pencarian pertama dicegat, ditemukan bahwa itu adalah intersep pertama dan cache belum di -cache. Jadi pertama -tama jalankan kelas antarmuka asli untuk mendapatkan data yang ditanyakan. Ini dapat diperoleh melalui kueri basis data, dan kemudian menghasilkan cache dan memasukkan data kueri ke dalam cache.
Setelah pencarian kedua dicegat, ditemukan bahwa cache sudah ada, sehingga kelas antarmuka asli tidak lagi dieksekusi, yaitu, database tidak lagi diminta, dan data kueri secara langsung diperoleh melalui cache. Tentu saja, ini hanya cetakan sederhana di sini.
Lalu ada pembaruan pertama . Operasi yang dilakukan setelah dicegat adalah untuk menyimpan semua data dalam cache ke dalam database dan menghapus cache.
Akhirnya, ada kueri ketiga . Setelah dicegat, ditemukan bahwa sistem tidak memiliki cache, sehingga database kueri kelas antarmuka asli, membuat cache, dan menempatkan data yang diperoleh dari kueri baru ke dalam cache. Metode yang sama dengan kueri pertama.
Sejauh ini kami telah menerapkan apa yang perlu dilakukan oleh Spring dengan Ehcache.
6 Kode Sumber Lampiran
Kode sumber lampiran dapat diperoleh dari situs web GitHub saya.
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.