我已经使用ehcache在我的Spring MVC中实现了声明性缓存。 下面是Spring config的代码。
<cache:annotation-driven />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcache" />
</bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml" />
<property name="shared" value="true"/>
</bean>
<bean id="UserDaoImpl" class="org.kmsg.dao.impl.UserDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
以下是ehcache xml config。
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
monitoring="autodetect" dynamicConfig="true">
<diskStore path="c:\\cache" />
<cache name="findUser"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="1000"
eternal="false"
diskSpoolBufferSizeMB="20"
timeToIdleSeconds="300" timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
<persistence strategy="localTempSwap" />
</cache>
</ehcache>
这是我想要实现缓存的适配器类:
public class LoginAdapter
{
static UserDaoImpl daoimpl =(UserDaoImpl)MainAdapter.context.getBean("UserDaoImpl");
@Cacheable(value="findUser", key="#userId")
public UserModel checkLogin1(String userId,String password)
{
UserModel model = daoimpl.selectUserInfo(userId);
return model;
}
}
用户道代码:
public class UserDaoImpl implements UserDaoInt
{
JdbcTemplate jdbc=new JdbcTemplate();
@Override
public void setDataSource(DataSource dataSource)
{
jdbc=new JdbcTemplate(dataSource);
}
@Override
public UserModel selectUserInfo(String userId)
{
String sql = "SELECT "
+ "user_id, "
+ "password, "
+ "no_of_device, "
+ "email_id, "
+ "otp, "
+ "approved, "
+ "secret_code, "
+ "os, "
+ "version, "
+ "version_name, "
+ "mobile_maker, "
+ "mobile_model "
+ "FROM user "
+ "WHERE user_id=?; ";
System.out.println("calling......");
return jdbc.queryForObject(sql,new Object[]{userId},new UserMapper());
}
}
最后这是服务:
@RequestMapping(value="/login" , method = RequestMethod.POST, headers="Accept=application/json")
public UserModel checkLogin1(@RequestParam Map<String, String> params)
{
String userid = params.get("userId");
String password = params.get("password");
return adapter.checkLogin1(userid, password);
}
当我运行项目并调用服务时,每次从数据库调用数据而不是从缓存调用数据。但是,缓存文件是在指定位置(c:\ cache)创建的,但这些文件是空的。
我找不到问题。日志中没有错误。这是我第一次做缓存。请帮帮我。
感谢。
答案 0 :(得分:0)
My apologies for not trying this out on my own first. My thinking is that your @Cacheable key is incorrect.
Please try with @Cacheable(value="findUser", key="#userId")
.
If this doesn't work, do tell.
答案 1 :(得分:0)
最后我解决了这个问题。 所有bean配置和依赖注入都是正确的。
我缺少的是我使用UserDaoImpl而不是UserDaoInt.So我将缓存从LoginAdapter移动到UserDaoImpl并使用UserDaoInt来定义bean。因为如果bean实现了一些接口,那么Spring默认会根据这个接口创建代理。
Here is a good article about proxy creation in Spring
但是我可以使用UserDaoImpl,但是我必须删除UserDaoInt的实现。