1

我正在使用ehcache-spring-annotations-1.2.0.jar 。 这是我的 cache.xml 文件

<?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:context="http://www.springframework.org/schema/context"
    xmlns:oxm="http://www.springframework.org/schema/oxm"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd">

    <ehcache:annotation-driven />



    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>



</beans>

这是我的 ehcache.xml

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

        <cache name="messageCache" eternal="false"
        maxElementsInMemory="5" overflowToDisk="false" diskPersistent="false"
        timeToIdleSeconds="1000" timeToLiveSeconds="3000"
        memoryStoreEvictionPolicy="LRU" />

这是我的主要代码

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.googlecode.ehcache.annotations.Cacheable;

public class EcacheSpringtest {
    private static ApplicationContext cachecontext = new ClassPathXmlApplicationContext("cache.xml");

    @Cacheable(cacheName = "messageCache")
    String getName(String name) {

        System.out.println(name+ " "+"has not been found in the cache so called getName()");
        return "testObject";

    }

    public static void main(String[] args) {
        long starttime;
        long endtime;
        long calldifferencesecs;

        EcacheSpringtest test = new EcacheSpringtest();
        test.getName("test");
        try {
            starttime = System.currentTimeMillis();
            Thread.sleep(150);
            endtime = System.currentTimeMillis();
            calldifferencesecs = starttime - endtime ;
            System.out.println("preparing to call getName with test as paramter after" +" "+ (~calldifferencesecs)+1 +"milliseconds");
        } catch (InterruptedException e) {

        }
        test.getName("test"); // In this case testObject should be returned from cache  but it is again calling getName().The method getName() is again called when same "test" String object is passed to method after 1491 milliseconds.

    }
}

我参考了

http://ehcache.org/documentation/recipes/spring-annotations

https://code.google.com/p/ehcache-spring-annotations/wiki/UsingCacheable

EditFirst实施 kabochkov 下面给出的解决方案我已经对其进行了测试。但我也无法缓存。

我不知道我在哪里做错了。请帮忙吗?

4

3 回答 3

7

I finally solved the problem.What mistake i was doing was that according to documentation https://code.google.com/p/ehcache-spring-annotations/wiki/UsingCacheable It was written You can place the @Cacheable annotation on a method on an interface, or a public method on a class. So before my method was not public .So i changed it to public and it worked.

于 2013-05-17T06:03:21.513 回答
5

如果直接创建对象,spring无法处理@Cacheable注解。

EcacheSpringtest test = new EcacheSpringtest();

使用依赖注入,它会工作!

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:cache.xml"})
public abstract class TestEcacheSpring {

  @Autowired
  EcacheSpringtest test;

  @Test
  public void test(){
    test.getName("test");
    test.getName("test"); 
  }

}

EcacheSpringtest 应该被标记为@Service

@Service
public class EcacheSpringtest {

@Cacheable(cacheName = "messageCache")
String getName(String name) {
 System.out.println(name+ " "+"has not been found in the cache so called getName()");
 return "testObject";
}

}
于 2013-05-16T08:47:21.237 回答
1

One thing I doubt here is that there is no reference at all to your ehcache.xml in your context.

I have used ehcache in production with following configuration in context.xml and it works perfectly.

Could you try after adding following to context (Note: You'll have to remove <ehcache:annotation-driven /> and also add spring-cache xmlns to context)

<cache:annotation-driven cache-manager="cacheManager" mode="proxy" proxy-target-class="true" />
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="classpath:ehcache.xml" p:shared="true" />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cacheManager-ref="ehcache" />

Add
xmlns:cache="http://www.springframework.org/schema/cache"

xsi:http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd

于 2013-05-16T08:47:21.410 回答