2017-11-30 13 views
0

SpringブートプロジェクトでMemcacheをセットアップしようとしましたが、動作しません。私はデフォルトのキャッシュ(ConcurrentMapCacheManager)を設定しようとしますが、うまくいきません。使用Springブートでキャッシュを設定できません

@Configuration 
@EnableCaching 
public class CacheConfiguration { 

    @Bean 
    public CacheManager cacheManager() { 
     return new ConcurrentMapCacheManager("test_cache"); 
    } 

} 

キャッシュ::

@Service 
@CacheConfig(cacheNames = "test_cache") 
public class UserServiceImpl extends IUserService { 
    ... 
    @Cacheable 
    public UserEntity getByEmail(String email) { 
     UserEntity entity = repository.findByEmail(email); 

     return entity; 
    } 
... 
} 

のpom.xml

私が読んですべてのチュートリアル(でも、春の公式)は、この設定は、セットアップキャッシュ

キャッシュ構成にenoughtあると言います

<dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-aop</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
      <version>1.5.2.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-devtools</artifactId> 
      <version>1.5.2.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jdbc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-validation</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>5.2.12.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>5.2.12.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hsqldb</groupId> 
      <artifactId>hsqldb</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-pool</groupId> 
      <artifactId>commons-pool</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.vladmihalcea</groupId> 
      <artifactId>hibernate-types-52</artifactId> 
      <version>1.1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-collections</groupId> 
      <artifactId>commons-collections</artifactId> 
      <version>3.2.2</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>2.0.0.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>io.reactivex.rxjava2</groupId> 
      <artifactId>rxjava</artifactId> 
      <version>2.1.5</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-cache</artifactId> 
     </dependency> 
    </dependencies> 

依存関係のいくつかがスプリングキャッシュの依存関係と競合する可能性はありますか?

+0

「それはうまくいかない」と詳しく説明できますか?例外はありますか? –

+0

@RobertFarley、同じemail paramのメソッドgetByEmailは毎回実行されますが、最初の後に結果をキャッシュします。 –

+0

メソッド 'getByEmail'が別のBeanから呼び出されます。コントローラーから? – lzagkaretos

答えて

1

この単純なキャッシュ構成がどのように機能しているかをデモンストレーションするプロジェクトを作成しました。

@Configuration 
@EnableCaching 
public class CachingConfig { 

    @Bean 
    public CacheManager cacheManager() { 
     return new ConcurrentMapCacheManager("test_cache"); 
    } 
} 

サービスのインターフェイスです。

public interface TestDataService { 
    String getEmail(String email); 
} 

対応する実装。

@Service 
@CacheConfig(cacheNames={"test_cache"}) 
public class TestDataServiceImpl implements TestDataService { 

    @Cacheable 
    public String getEmail(String email) { 
     return email; 
    } 
} 

ダミーコントローラ。あなたはhttpリクエストlocalhost:8080/testを呼び出して、あなたがTestDataServiceImpl.getEmail()にブレークポイントを置くとき

@RestController 
public class TestDataController { 

    private TestDataService testDataService; 

    @Autowired 
    public TestDataController(TestDataService testDataService) { 
     this.testDataService = testDataService; 
    } 

    @RequestMapping(value = "test") 
    String getEmail() { 
     return testDataService.getEmail("test.me"); 
    } 
} 

その後、あなたはメソッドが実際に実行されている初回のみことがわかります。

ご希望の場合は、githubにコードを追加しました。あなたはシリアライズさする必要がありますあなたのUserEntityをMemcachedの使用している場合

2

(すなわちUserEntityはSerializableを実装して)。

Memcached hereでSpring Bootを使用している小さなサンプルプロジェクトを確認できます。

関連する問題