
開発中のアプリケーションでは、ある時点でパフォーマンスの問題が発生する可能性があります。 問題を解決する1つの方法は、キャッシュを使用することです。 当然、データベースから返されたデータをキャッシュできます(Hibernate-javaで最もよく使用されているのは、とにかくこれを行います)-しかし、もっと興味深いのは「サービス」レベルから返された値のキャッシュです。 そのような値の計算は、データベース、他のサービス、計算への多くの呼び出しを含む非常に時間がかかる可能性があります。したがって、このレベルでキャッシュすると、より重要な結果が得られます。
Spring Framework 3.1では、これは@Cacheableアノテーションを使用して行うことができます
実際、以前はSpring Frameworkでサービスレベルでのキャッシングを行うことができましたが、今でははるかに簡単になります。
値のキャッシュ
たとえば、プロファイリング中に特定のメソッドが「ダム」であることがわかった場合、たとえば(ドキュメントのように)ISBNに関する本を返すメソッド:
public Book findBook(ISBN isbn) {...}
ここで、このメソッドによって返された値をキャッシュするには、注釈を追加するだけです:
@Cacheable("books")
public Book findBook(ISBN isbn) {...}
このアノテーション自体はインターセプターをハングさせ、パラメーターに従ってキーを作成し、キャッシュに値があるかどうかを確認し、そうでない場合はメソッドを呼び出して結果をキャッシュします。
それだけですか? ほぼ完全にするには、次のものが必要です。
アプリケーションでキャッシュを設定する
これは、アプリケーションコンテキスト構成xmlで行われます。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cache www.springframework.org/schema/cache/spring-cache.xsd">
<cache:annotation-driven />
cache-managerを構成します-たとえば、最も単純な(ConcurrentMapを使用)
<bean class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean" p:name="default"/>
<bean class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean" p:name="books"/>
またはehcache(他の実装を使用できます):
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhcacheCacheManager" p:cache-manager="ehcache"/>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache.xml"/>
キャッシュをクリア
データは慎重にキャッシュする必要があります-データが更新されると常にエラーの潜在的な原因になりますが、キャッシュはなく、アプリケーションは古いデータを使用します。 キャッシュのクリアは、アノテーション@CacheEvictを使用して行うこともできます。
@CacheEvict(value = "books", allEntries=true)
public void loadBooks(InputStream batch)
以上です。 ただ? そうそうです。 実際、キャッシングメカニズムは非常に柔軟であり、多くの追加機能(独自の注釈の作成、キーの生成など)がありますが、基本的な機能は非常にシンプルに見えます。