2016-11-09 237 views
0

在一個具有休息實現(沒有彈簧安全性的會話)的spring引導應用程序中,我想避免多次調用用戶表的數據庫。緩存未用於彈簧引導

在誰擴展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中(可能做到這一點在Java中?)

<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

所有的代碼可以用Spring Boot消失。我們會自動檢測'ehcache.xml',併爲您配置它。你只需要'@ EnableCaching'來觸發它。如果您有執行器,我們會爲'/ metrics'上的每個緩存導出統計信息。 –

+0

好的以及如何說當用戶嘗試登錄時使用我的緩存? –

+0

哦,我現在得到了問題。我想要啓用Hibernate的二級緩存。您應該重讀hibernate文檔或更改您的問題,因爲根本不會這樣做。你在配置Spring的緩存抽象,[檢查文檔](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); 

在你的代碼,這將意味着

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

日誌設置到調試的net.sf.ehcache.Cache也會給你喜歡緩存的創作,過期等一些信息。但是,你不會看到命中和錯過。

0

只寫一個演示代碼:

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

如果緩存是工作,沒有在控制檯的任何輸出。