Spring Ehcache 不工作
Spring Ehcache not working
我已经使用 ehcache 在我的 Spring MVC 中实现了声明式缓存。
下面是 Spring 配置的代码。
<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>
下面是ehcachexml配置
<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>
这是我要实现缓存的适配器 class:
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)创建的,但这些文件是空的。
我找不到问题。日志中没有错误。这是我第一次做缓存。请帮我解决这个问题。
谢谢。
很抱歉没有先自己尝试一下。我的想法是您的@Cacheable 密钥不正确。
请尝试 @Cacheable(value="findUser", key="#userId")
。
如果这不起作用,请告诉。
我终于解决了这个问题。
所有的 bean 配置和依赖注入都是正确的。
我缺少的是我使用的是 UserDaoImpl 而不是 UserDaoInt.So 我将可缓存从 LoginAdapter 移动到 UserDaoImpl 并使用 UserDaoInt 定义 bean。因为如果 bean 实现了一些接口,那么默认情况下 Spring 将基于该接口创建代理。
Here is a good article about proxy creation in Spring.
但是,如果我愿意,我可以使用 UserDaoImpl,但是我必须删除 UserDaoInt 的实现。
我已经使用 ehcache 在我的 Spring MVC 中实现了声明式缓存。 下面是 Spring 配置的代码。
<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>
下面是ehcachexml配置
<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>
这是我要实现缓存的适配器 class:
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)创建的,但这些文件是空的。
我找不到问题。日志中没有错误。这是我第一次做缓存。请帮我解决这个问题。
谢谢。
很抱歉没有先自己尝试一下。我的想法是您的@Cacheable 密钥不正确。
请尝试 @Cacheable(value="findUser", key="#userId")
。
如果这不起作用,请告诉。
我终于解决了这个问题。 所有的 bean 配置和依赖注入都是正确的。
我缺少的是我使用的是 UserDaoImpl 而不是 UserDaoInt.So 我将可缓存从 LoginAdapter 移动到 UserDaoImpl 并使用 UserDaoInt 定义 bean。因为如果 bean 实现了一些接口,那么默认情况下 Spring 将基于该接口创建代理。
Here is a good article about proxy creation in Spring.
但是,如果我愿意,我可以使用 UserDaoImpl,但是我必须删除 UserDaoInt 的实现。