2016-11-09 111 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); 
} 

如果缓存是工作,没有在控制台的任何输出。