2016-11-09 3 views
0

나머지 구현 (스프링 보안과 세션 없음)이있는 스프링 부팅 응용 프로그램에서 사용자 테이블에 대한 데이터베이스 호출이 여러 번 발생하지 않도록하고 싶습니다. WebSecurityConfigurerAdapter를 확장하는 클래스에서 캐시가 봄 부팅과 함께 사용되지 않음

, 내가

@Bean 
public AuthenticationProvider authenticationProviderBean() throws Excen { 
    DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider(); 
    authenticationProvider.setPasswordEncoder(passwordEncoder); 
    authenticationProvider.setUserCache(userCache); 
    authenticationProvider.setUserDetailsService(userDetailsServiceBean()); 

    return authenticationProvider; 
} 

@Configuration 
@EnableCaching 
public class CacheConfig { 

    @Bean 
    public EhCacheFactoryBean ehCacheFactoryBean(){ 
     EhCacheFactoryBean ehCacheFactory = new EhCacheFactoryBean(); 
     ehCacheFactory.setCacheManager(cacheManagerFactoryBean().getObject()); 
     return ehCacheFactory; 
    } 

    @Bean 
    public CacheManager cacheManager(){ 
     return new EhCacheCacheManager(cacheManagerFactoryBean().getObject()); 
    } 

    @Bean 
    public EhCacheManagerFactoryBean cacheManagerFactoryBean() { 
     EhCacheManagerFactoryBean cacheManager = new EhCacheManagerFactoryBean(); 
     return cacheManager; 
    } 


    @Bean 
    public UserCache userCache() { 
     EhCacheBasedUserCache userCache = new EhCacheBasedUserCache(); 
     userCache.setCache(ehCacheFactoryBean().getObject()); 
     return userCache; 
    } 
} 

ehcache.xml (자바에서 그것을 할 가능성?)

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true"> 
    <diskStore path="java.io.tmpdir"/> 
    <defaultCache 
    maxEntriesLocalHeap="10000" 
    eternal="false" 
    timeToIdleSeconds="60" 
    timeToLiveSeconds="300" 
    maxEntriesLocalDisk="10000000" 
    diskExpiryThreadIntervalSeconds="120" 
    memoryStoreEvictionPolicy="LRU"> 
    <persistence strategy="localTempSwap"/> 
    </defaultCache> 
</ehcache> 

어떻게해야 할 다음 내 캐시를 사용하는가?

실제로 내가 쿼리 쉬운 방법은 통계를 사용하는 서버

+0

모든 코드는 스프링 부트와 함께 사라질 수 있습니다. 우리는 자동적으로'ehcache.xml'을 탐지하고 그것을 설정합니다. '@ EnableCaching' 만 필요합니다. 액츄에이터를 가지고 있다면'/ metrics'에 각 캐시에 대한 통계를 수출합니다. –

+0

확인하고 사용자가 로그하려고 할 때 내 캐시를 사용하는 방법은 무엇입니까? –

+0

아, 이제 문제가 생깁니다. 추측 하건데 Hibernate의 2 차 캐시를 활성화하려고합니다. 최대 절전 모드 문서를 읽거나 질문을 다시 말해야 할 것입니다. 왜냐하면 그렇게하지 않을 것이기 때문입니다. Spring의 캐시 추상화를 구성하는 부분은 무엇입니까? [doc 문서 확인] (http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/cache.html) –

답변

0

에서 수행을 참조하십시오. 정확하게 기억한다면 statistics="true"을 추가하십시오. 따라서 캐시 관리자를 등록하여 JMX에서 캐시 적중 및 누락을 확인할 수 있습니다. 코드에서

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
ManagementService.registerMBeans(cacheManager, mBeanServer, false, false, false, true); 

, 즉 또한 당신에게 등등 캐시 창조, 만료과 같은 몇 가지 정보를 줄 것이다 net.sf.ehcache.Cache에 대한 디버그 할

@Bean 
public CacheManager cacheManager(){ 
    net.sf.ehcache.CacheManager cacheManager = cacheManagerFactoryBean().getObject(); 

    MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
    ManagementService.registerMBeans(cacheManager, mBeanServer, false, false, false, true); 

    return new EhCacheCacheManager(cacheManager); 
} 

설정 로그를 의미 할 것입니다. 그러나 히트와 미스는 볼 수 없습니다. 캐시 작업이

@Cacheable(value = "v") 
public Object get(int id){ 
    System.out.println("get from db"); 
    return dao.findById(id); 
} 

경우, 아니 당신의 콘솔에서 모든 출력이 :

0

그냥 데모 코드를 작성합니다.