abi*_*rai 1 java spring ehcache
我正在使用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>
Run Code Online (Sandbox Code Playgroud)
这是我的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" />
Run Code Online (Sandbox Code Playgroud)
这是我的主要代码
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.
}
}
Run Code Online (Sandbox Code Playgroud)
我已经参考了
http://ehcache.org/documentation/recipes/spring-annotations
https://code.google.com/p/ehcache-spring-annotations/wiki/UsingCacheable
EditFirst实现kabochkov下面给出的解决方案我已经测试过了.但是我也无法缓存.
我无法弄清楚我的错误在哪里.请帮忙吗?
我终于解决了这个问题.我正在做的错误是根据文档 https://code.google.com/p/ehcache-spring-annotations/wiki/UsingCacheable 编写它 可以将@Cacheable注释放在方法上在接口上,或在类上的公共方法.所以在我的方法不公开之前.所以我把它改为公开并且有效.
如果直接创建对象,则spring无法处理@Cacheable注释.
EcacheSpringtest test = new EcacheSpringtest();
Run Code Online (Sandbox Code Playgroud)
使用依赖注入,它将工作!
@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");
}
}
Run Code Online (Sandbox Code Playgroud)
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";
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12328 次 |
| 最近记录: |