2017-05-17 8 views
1

私はEhcacheの(2.4.3)Ehcacheのは

キャッシュは、DEV環境で使用されているが、それが使用されていない(春ブーツ(1.4.2.RELEASE)とを使用していますテストENVで働いていませんヒット)他の環境(テストとプロダクト)。

コードは以下の通りです:

のpom.xml

<dependency> 
      <groupId>net.sf.ehcache</groupId> 
      <artifactId>ehcache</artifactId> 
</dependency> 

メインクラスで、SRCの下でのキャッシング

@EnableCaching 
public class Application { 

のための注釈の下に追加されている/メイン/リソース、ehcache.xml

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="ehcache.xsd" 
    updateCheck="true" monitoring="autodetect" dynamicConfig="true"> 

    <cache name="languageCache" 
     maxEntriesLocalHeap="20" 
     overflowToDisk="false" 
     eternal="false" 
     diskPersistent="false" 
     memoryStoreEvictionPolicy="LRU"/> 

    <cache name="countryCache" 
     maxEntriesLocalHeap="280" 
     overflowToDisk="false" 
     eternal="false" 
     diskPersistent="false" 
     memoryStoreEvictionPolicy="LRU"/> 
.. 
.. 
more entries 
</ehcache> 

キャッシュ設定ファイル上記のコードで

@Configuration 
@EnableCaching 
public class CacheConfig { 

    @Bean 
    public CacheManager getEhCacheManager() { 
     (new EhCacheCacheManager(getEhCacheFactory().getObject())).getCache("languageCache"); 
     return new EhCacheCacheManager(getEhCacheFactory().getObject()); 
    } 

    @Bean 
    public EhCacheManagerFactoryBean getEhCacheFactory() { 
     EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean(); 
     factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); 
     factoryBean.setShared(true); 
     return factoryBean; 
    } 
} 

いくつかの質問:

1)それは

factoryBean.setConfigLocation(新ClassPathResource( "にehcacheによりこの行することです.xml "));

Dev env以外の環境でキャッシュがヒット/使用されていませんか?

2)CacheConfigファイルはまったく必要ですか?またはSpringブートはメインクラスのアノテーション(@EnableCaching)を使用してEhcacheを検出しますか?

他のenvでキャッシュが選択されていない(いくつかの設定がありませんか?)

は、あなたのクラスパスにehcache.xml多くを持っている場合を除き、それは動作するはずですあなた

+0

テスト環境と本番環境がdevとどのように違うのですか? コードに違いはありませんか?異なるSpringプロファイルまたは異なるMavenビルドプロファイル? ところで、コードは正常に見えます。 – PaulNUK

+0

なぜ2つの 'EhCacheCacheManager'インスタンスを作成するのがハックのようですか?あなたの 'CacheManager'は' CacheManager'という名前にする必要があります。 –

+0

こんにちはPaul、yes環境設定ファイルは環境によって異なります。しかし、私はこれらのparamファイルにキャッシュ用の設定を持っていません。 CacheConfig.javaでehcache.xmlを設定しているとき、ClassPathResource以外の何かを使うべきですか? – Khushi

答えて

0

ありがとうございます。 @EnableCachingは、クラスパスにJSR107準拠の実装(Ehcache 3など)がない限り、魔法では機能しません。

コードは機能します。唯一の変わった部分は、getObject()と自分で呼んでいることです。それでも動作しますが、私はやったでしょう。言っ

@Bean 
public CacheManager cacheManager(net.sf.ehcache.CacheManager cacheManager) { 
    return new EhCacheCacheManager(cacheManager); 
} 

@Bean 
public EhCacheManagerFactoryBean cacheManagerFactory() { 
    EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean(); 
    factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); 
    factoryBean.setShared(true); 
    return factoryBean; 
} 

、私は、実際には、単純に何か行っているでしょう:

また
@Configuration 
@EnableCaching 
public class CacheConfig extends CachingConfigurerSupport { 

    @Bean 
    @Override 
    public CacheManager cacheManager() { 
     return new EhCacheCacheManager(new net.sf.ehcache.CacheManager()); 
    } 
} 

、あなたが本当に共有キャッシュマネージャを必要とすることを本当に稀であることに注意を。すでにアプリケーションコンテキスト全体で共有されています。したがって、シングルトンとして共有することは非常にまれです(そして、しばしば危険です)。

+0

返信いただきありがとうございます。私は2つのehcache.xml(1つはパスsrc/main/resourcesにあり、もう1つはパスsrc/test/resourcesにあります)とSpringブートでEhcacheを選択するために、私はpomにEhcache依存関係があります。つまり、factoryBean.setConfigLocation(new ClassPathResource( "ehcache.xml"))を使用しないと、それはうまくいくはずですか?私はあなたのコードを試します。 – Khushi

+0

いいえ同じです。新しいCacheManager()はデフォルトで 'ehcache.xml'を取っています。テストとプロダクトのために 'ehcache.xml'を持つことも頻繁にあります。ただし、IDEはローカルで実行しているときにテストを使用することがあります。違いを説明することができます。 – Henri

+0

ありがとうアンリ、私はコードをきれいにし、キャッシュが動作していることを確認しました。再度、感謝します – Khushi