2017-01-21 3 views
-1

ehcache를 사용하여 Spring MVC에서 선언적 캐싱을 구현했습니다. 아래는 Spring 설정 코드입니다.Spring Ehcache가 작동하지 않습니다.

<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); 
    } 

프로젝트를 실행하고 th를 호출하면 e 서비스에서 데이터가 캐시에서가 아니라 데이터베이스에서 호출 될 때마다. 그러나 캐시 파일은 지정된 위치 (c : \ cache)에 만들어 지지만이 파일은 비어 있습니다.

문제를 찾을 수 없습니다. 로그에 오류가 없습니다. 이것은 캐싱을 처음 한 시간입니다. 이것 좀 도와주세요.

감사합니다.

답변

0

마지막으로 나는 문제를 해결했다. 모든 빈 구성 및 종속성 삽입이 옳았습니다.

제가 놓친 것은 UserDaoImpl 대신 UserDaoImpl을 사용한다는 것입니다. LoginAdapter에서 UserDaoImpl로 캐시를 이동하고 Bean을 정의하기 위해 UserDaoInt를 사용했습니다. 왜냐하면 빈이 어떤 인터페이스를 구현하면 기본적으로 Spring은이 인터페이스를 기반으로 프록시를 생성 할 것이기 때문이다.

Here is a good article about proxy creation in Spring.

그러나 내가 원한다면 UserDaoImpl을 사용할 수 있지만 UserDaoInt 구현을 제거해야합니다.

0

내 자신의 첫 번째 시도하지 않는 것에 대해 사과드립니다. 내 생각에 @Cacheable 키가 잘못되었습니다.

@Cacheable(value="findUser", key="#userId")으로 시도하십시오.

그래도 해결되지 않으면 알려주십시오.

+0

시간 내 주셔서 감사합니다. 키를 업데이트했지만 여전히 작동하지 않습니다. – RishiPandey