1 Ehcacheの紹介
ehcacheは、高速で無駄のない機能を備えた純粋なJavaインプロセスキャッシュフレームワークであり、冬眠のデフォルトのキャッシュプロバイダーです。
Ehcacheは、広く使用されているオープンソースJava分散キャッシュです。主にユニバーサルキャッシュ、Java EE、および軽量コンテナを対象としています。メモリとディスクストレージ、キャッシュローダー、キャッシュ拡張機能、キャッシュ例外ハンドラー、GZIPキャッシュサーブレットフィルターの機能があり、RESTおよびSOAP APIをサポートしています。
Ehcacheはもともと2003年にGreg Luckによって開発されました。2009年、プロジェクトはTerracottaによって購入されました。ソフトウェアはまだオープンソースですが、いくつかの新しい主要な機能(たとえば、速い再起動の一貫性)は、エンタープライズehcacheやBigMemoryなどの商用製品でのみ使用できます。 Wikimedia Foundation Announcedは現在、ehcacheテクノロジーを使用しています。
要するに、Ehcacheは依然として優れたキャッシュテクノロジーです。 SpringがEhcacheでどのように実装されているかを見てみましょう。
Ehcacheで2つの春
システムの結果は次のとおりです。
3特定の構成紹介
これらの部分の組み合わせがあります:
SRC:インターセプター、呼び出しインターフェイス、テストクラスを含むJavaコード
src/cache-bean.xml:ehcache、インターセプター、およびテストクラスなどに対応するBeanを構成します。
src/ehcache.xml:ehcacheキャッシュ構成情報
Webroot/lib:ライブラリ
4詳細なコンテンツの紹介
4.1 SRC
4.1.1インターセプター
2つのインターセプターが最初にコードで構成されています。
最初のインターセプターは次のとおりです。
com.test.ehcache.cachemethodInterceptor
コンテンツは次のとおりです。
パッケージcom.test.ehcache; import java.io.serializable; Import net.sf.ehcache.cache; Import net.sf.ehcache.element; Import org.aopalliance.intercep.methodInterceptor; Import org.aopalliance.intercept.methodinvoction; org.springframework.util.assert; public class cachemethododinterceptorは、MethodInterceptor、initializingbean {privateキャッシュキャッシュ; public void setCache(キャッシュキャッシュ){this.cache = cache; } public cachemethodInterceptor(){super(); } /*** ServiceManagerメソッドをインターセプトし、結果が存在するかどうかを調べます。存在する場合は、キャッシュの値を返します。 *それ以外の場合は、データベースクエリの結果を返し、クエリ結果をキャッシュに入れます */publicオブジェクトInvoke(MethodInvocation Invocation)スロー可能{// class string targetnameを挿入する= Invocation.getThis()。getClass()。getName(); getName(); //クラスのメソッドをインターセプトされますstring methodname = invocation.getMethod()。getName(); //クラスのメソッドのパラメーターを取得して、オブジェクト[]引数=招待状.getarguments();オブジェクトの結果; //文字列を作成して、cache string cachekey = getCacheKey(TargetName、MethodName、arguments)でキーを作成します。 // cache element element = cache.get(cachekey)からデータを取得します。 if(element == null){//キャッシュにデータがない場合は、データベースなどの非キャッシュを探して、見つかったものをキャッシュにresult = ilvocation.proceed()に入れます。 //キャッシュ要素に保存されるキーと値を生成= new Element(cachekey、(serializable)result); System.out.println( "----データベースを直接検索したり、検索後にキャッシュに入れたりするなど、非キャッシュ検索を入力します"); //キーと値をキャッシュcache.put(element)に保存します。 } else {//キャッシュにデータがある場合は、cache system.out.println( "---キャッシュ検索を入力して、データベースを探しず、データベースの圧力を緩和しないでください"); } return element.getValue(); } /***キャッシュキーを取得するメソッド。キャッシュキーは、キャッシュ内の要素の一意の識別子です。 *パッケージ名 +クラス名 +メソッド名を含む、com.test.service.testserviceimpl.getobject */ private string getcachekey(string targetname、string methodname、objectname [] arguments){stringbuffer sb = new StringBuffer(); sb.append(targetname).append( "。")。append(methodname); if((arguments!= null)&&(arguments.length!= 0)){for(int i = 0; i <arguments.length; i ++){sb.append( "。")。append(arguments [i]); }} return sb.toString(); } / ** * initial initializingbeanを実装して、キャッシュが空であるかどうかを確認します * / public void afterpropertiesset()スロー{assert.notnull( "cache、"キャッシュが必要です。SetCache(キャッシュ)を使用してください。 "); }}CachemethodInterceptorは、「GET」から始まるメソッドを傍受するために使用されます。このインターセプターは最初にインターセプトし、元の呼び出しインターフェイスを実行することに注意してください。
インターセプターもあります。
com.test.ehcache.cachefterturningadvice
特定のコンテンツ:
パッケージcom.test.ehcache; import java.lang.refllect.method; import java.util.list; import net.sf.ehcache.cache; import org.springframework.aop.aop.afterreturningadvice; Import org.springframework.beans.beans.initializingbeant. cacheafterturningadviceは、afterreturningadvice、intivityizingbean {private cache cache; public void setCache(キャッシュキャッシュ){this.cache = cache; } public cachefterreturningadvice(){super(); } public void afterreturning(object arg0、method arg1、object arg2、object arg3)throws throws {string classname = arg3.getClass()。getName();リストリスト= cache.getKeys(); for(int i = 0; i <list.size(); i ++){string cachekey = string.valueof(list.get(i)); if(cachekey.startswith(classname)){cache.remove(cachekey); System.out.println( "-----クリアキャッシュ"); }}} public void afterpropertiesset()throws exception {assert.notnull(cache、 "キャッシュが必要です。SetCache(cache)createを使用してください。"); }}cacheafterturningadviceは、「更新」から始まるメソッドを傍受するために使用されます。このインターセプターは最初に元の呼び出しインターフェイスを実行し、次に傍受されることに注意してください。
4.1.2インターフェイスの呼び出し
インターフェイス名は次のとおりです。
com.test.service.servicemanager
特定のコンテンツは次のとおりです。
パッケージcom.test.service; import java.util.list; public interface servicemanager {public list getobject(); public void updateObject(オブジェクトオブジェクト); }実装クラス名は次のとおりです。
com.test.service.servicemanagerimpl
特定のコンテンツは次のとおりです。
パッケージcom.test.service; import java.util.arraylist; import java.util.list; public class servicemanagerimplはServiceManager {@Override public list getObject(){system.out.println( "----- Servicemanager:この要素は存在しません。 nullを返します。 } @Override public void updateObject(object object){system.out.println( "---- servicemanager:オブジェクトが更新され、このクラスによって生成されたすべてのキャッシュが削除されます!"); }}4.1.3テストクラス
テストクラス名は次のとおりです。
com.test.service.testmain
特定のコンテンツは次のとおりです。
パッケージ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); // Proxy Factory ProxyFactoryによって生成されたBeanを取得して、ServiceManager testService =(ServiceManager)Context.getBean( "ProxyFactory")を生成します。 // System.out.println( "=====最初の検索"); testservice.getObject(); // Sevent Searching System.out.println( "===== 2番目の検索"); testservice.getObject(); // Sevent Searching System.out.println( "====== 3回目の検索"); testservice.updateObject(null); // System.out.println( "====== 3回目の検索"); testservice.getObject(); }}ここでは、豆の入手はプロキシファクトリープロキシファクトリーによって生成され、傍受効果があることに注意してください。
テストクラスで4つの呼び出しが設定されていることがわかり、実行命令は次のとおりです。
最初のルックアップ2番目のルックアップ最初のルックアップは3番目のルックアップを更新します
4.2 SRC/CACHE-BEAN.XML
cache-bean.xmlは、ehcache、インターセプター、およびテストクラスに対応する豆の構成に使用されます。コンテンツは次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype beans public " - // spring // dtd bean // en" "" http://www.springframework.org/dtd/spring-beans.dtd "> <beans> < <プロパティ名= "configlocation"> <value> ehcache.xml </value> </property> </bean> <! - ehcacheのファクトリーを定義し、使用したキャッシュの名前を設定し、「com.tt」 - > <bean id = "ehcache"> <propational name = "cachemanager"> <ref ref of> <キャッシュ - > <プロパティ名= "cachename"> <value> com.tt </value> </property> </bean> <! - キャッシュとクエリのキャッシュを作成するためのインターセプター - > <bean id = "cachemethodInterceptor"> <プロパティ名= "cache"> <reg local = "ehcache"キャッシュ - > <bean id = "cacheafterreturningadvice"> <プロパティ名= "cache"> <ref local = "ehcache" /> < /property> < /bean> <! - インターセプトされたオブジェクト、> <bean id = "servicemanager" /> <! - インターセプターを挿入するインターセプターを挿入するために、インターセプターを挿入します。インターセプターはここでcom.test.ehcache.cachemethodInterceptor-> <bean id = "cachepointcut"> <! - セクションを追加します。セクションは、印刷方法を実行した後に追加されるセクションです - > <プロパティ名= "アドバイス"> <ref local = "cachemethodinterceptor" />> <property namotsキャラクター### +は、前の文字に一度または複数回適合することを意味します###*は、前の文字ゼロまたは複数回に準拠することを意味します###/正規表現で使用されるシンボル - > <! - 。*は、前のプレフィックス(パッケージ名を含む)を意味します。インターセプターインターセプトメソッド名などの特性は、インターセプターcom.test.ehcache.cachefterreturningadvice-> <bean id = "cachepointcutadvice"> <プロパティ名= "> <ref local =" cacheafterreturningadvice " /> < /propertion> <properts =" pittern <つまり、updateObjectメソッド - > <value> <value> cachepointCut </value> <value> cachepointCutadvice </value> </list> </property> </beans>
各豆の内容はコメントされており、工場の豆をエージェントすることを忘れないでください。
4.3 SRC/EHCACHE.XML
ehcache.xmlは、次のように、ehcacheキャッシュ構成に関する詳細情報を保存します。
<?xml version = "1.0" encoding = "utf-8"?> <ehcache xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation = "http://ehcache.org/ehcache.org/ehcache.xds <ディスクストアパス= "d:// temp // cache"/> <defaultcache maxelementsinmemory = "1000" eterinal = "false" timetoidleSeconds = "120" TimetoliveseConds = "120" Overflowtodisk = "true"/>> < maxElementsInmemory = "10000" eter = "false" TimetoidLeseConds = "300000" TimetolivesConds = "600000" Overflowtodisk = "true" /> < /ehcache>
キャッシュされたストレージのストレージ場所は「D:/TEMP/キャッシュ」に設定されており、図に示すように、キャッシュ名は「com.tt」に設定されていることがわかります。
4.4 Webroot/lib
必要なJavaライブラリについては、ここで省略した最初のシステム構造の画像をご覧ください。
5テスト
テストクラスを実行すると、テスト結果は次のとおりです。
実行の結果を通じて、私たちは見ることができます:
最初の検索がインターセプトされた後、それが最初のインターセプトであり、キャッシュがキャッシュされていないことがわかります。したがって、最初に元のインターフェイスクラスを実行して、データをクエリにします。データベースクエリを介して取得してから、キャッシュを生成してクエリデータをキャッシュに配置できます。
2回目の検索が傍受された後、キャッシュが既に存在することがわかったため、元のインターフェイスクラスは実行されなくなりました。つまり、データベースはクエリがなくなり、クエリデータはキャッシュを介して直接取得されます。もちろん、ここでは単純な印刷です。
次に、最初のアップデートがあります。インターセプトされた後に行われる操作は、キャッシュ内のすべてのデータをデータベースに保存し、キャッシュを削除することです。
最後に、 3番目のクエリがあります。インターセプトされた後、システムにはキャッシュがないため、元のインターフェイスクラスクエリデータベースがキャッシュを作成し、新しいクエリから取得したデータをキャッシュに配置することがわかっています。最初のクエリと同じ方法。
これまでに、springがehcacheで行う必要があることを実装してきました。
6添付ソースコード
添付ソースコードは、GitHub Webサイトから取得できます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。