7

Spring(3.1)での@Cacheableの使用法については、次のとおりです。

バネ:

<?xml   version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
    xmlns:sec="http://www.springframework.org/schema/security"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:cache="http://www.springframework.org/schema/cache"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 
                            http://www.springframework.org/schema/security/spring-security-oauth2-1.0.xsd
                            http://www.springframework.org/schema/data/mongo
                            http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
                            http://www.springframework.org/schema/cache 
                            http://www.springframework.org/schema/cache/spring-cache.xsd
                            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
                            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
                            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
                            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

<cache:annotation-driven />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache" />
<!-- Ehcache library setup -->
<bean id="ehcache"  class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
    p:config-location="classpath:ehcache.xml" />

Maven:

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>2.5.3</version>
    </dependency>

キャッシュされるメソッド:

@Cacheable(value="cahceName", key="concat(#param1).concat(‘-’).concat(#param2)")
    public String cachedMethod(String param1,String param2)

残念ながら、コードをデバッグすると、param1とparam2が同じである(つまり、cahceが使用されていない)場合でも、キャッシュされたメソッドが複数回呼び出されることがわかります。

何か案は?

4

2 に答える 2

19

キーが正しく表示されない-

あなたが意味したかもしれません-@Cacheable(value="cacheName", key="#param1.concat(‘-’).concat(#param2)")

さらに、デバッグ情報なしでコンパイルが実行された場合、param1、param2引数名は式エバリュエーターで使用できません。代わりに、次のようにp0、p1などを使用してそれらを参照できます。

@Cacheable(value="cahceName", key="#p0.concat('-').concat(#p1)")

アップデート:

これがどのように機能するかを示す1ページのテストがあります-https://gist.github.com/3315275

于 2012-08-09T19:17:02.777 に答える
1

私の場合、問題はキャッシュプロバイダー( Caffeine )の間違った構成を使用することによって引き起こされました:

@Bean
public Caffeine<Object, Object> caffeineCacheBuilder() {
    return Caffeine.newBuilder()
        .initialCapacity(100)
        .maximumSize(1000)
        .expireAfterAccess(10, TimeUnit.MINUTES)
        .weakKeys(); // cause problems when concatenated keys used
}

ドキュメントが言うように、weakKeys()方法:

キャッシュに格納されている各キー(値ではない)をWeakReferenceでラップする必要があることを指定します(デフォルトでは、強参照が使用されます)。

警告:このメソッドを使用すると、結果のキャッシュはID({@code ==})比較を使用してキーの同等性を判断します。したがって、その{@link Cache#asMap}ビューは、技術的には{@link Map}仕様に違反します({@link IdentityHashMap}と同じ方法で)。

于 2020-01-10T06:54:45.763 に答える