SpringBoot与Ehcache

时间:2016-02-03 05:40:16

标签: spring-boot ehcache

我正在使用spring boot,我已在程序中配置了ehcache。我的应用程序类看起来像

SprinbootApplication.Class

@SpringBootApplication
@EnableJpaRepositories(basePackages = { "in.secondlevelcache.persistance"})
@EntityScan(basePackages = { "in.secondlevelcache.entity"})
@ComponentScan(basePackages = { "in.secondlevelcache.*"})
@EnableCaching
public class SpringApplicationClass  extends SpringBootServletInitializer{

@Autowired
StudentInter studentInterfaceService;

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

    return application.sources(SpringApplicationClass.class);
}

public static void main(String args[]) throws Exception{

    SpringApplication.run(SpringApplicationClass.class, args);  
}

@Bean
public ServletRegistrationBean jerseyServlet(){
    ServletRegistrationBean register = new ServletRegistrationBean(new ServletContainer(),"/*");
    register.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyInitialize.class.getName());
    return register;
}

@Bean
public CacheManager getEhCacheManager(){
    return  new EhCacheCacheManager(getEhCacheFactory().getObject());
}


@Bean
public EhCacheManagerFactoryBean getEhCacheFactory(){
    EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
    factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
    factoryBean.setShared(true);
    return factoryBean;
}

@Bean
public List<Student> getAllStudentData(){
    System.out.println("Inside the GetAllStudentData of Spring Initalize");
    return studentInterfaceService.getUser();
}

ehcache.xml中

<?xml version="1.0" encoding="UTF-8"?>

<ehcache>
<defaultCache eternal="true" maxElementsInMemory="100" overflowToDisk="false" />
<cache name="empcache" maxElementsInMemory="10" eternal="true" overflowToDisk="false" />
</ehcache>

我的界面类

@Service
 @Cacheable("empcache")
public interface StudentInter {


public List<Student> getUser();

public List<LabelMaster> getAllLabelValue(String language);

public List<LabelMaster> getAllLocaleLabelValue();
}

我的实体类

@Entity
@Table(name="Student")
@Access(AccessType.FIELD)
@Cacheable(value = true)
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)

public class Student {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="roll")
private int rollId;

@Column(name="name")
private String name;

@Column(name="address")
private String address;

@Column(name="telephone")
private long phone;

public int getRollId() {
    return rollId;
}

public void setRollId(int rollId) {
    this.rollId = rollId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public long getPhone() {
    return phone;
}

public void setPhone(long phone) {
    this.phone = phone;
}


}

我使用存储库

调用实体类

我在服务器启动期间调用方法get user(),我可以看到查询在我的日志中执行,之后我尝试使用rest服务调用相同的方法我可以在我的日志中看到相同的查询,但之后我使用休息服务调用相同的方法我dint看到任何查询

我的问题是 1)我在服务器启动期间将数据从db加载到二级缓存,然后在我使用rest服务调用相同方法时执行查询的原因是什么?

1 个答案:

答案 0 :(得分:1)

首先,您可以删除自Spring Boot 1.3以来的所有ehcache设置,它会自动自动配置。由于您使用的是默认的&#34; ehcache.xml&#34;位置,Spring Boot将自动检测并为您创建缓存管理器。如果您使用不同的配置位置,则有一个属性可以告诉Spring Boot在哪里可以找到缓存的配置(spring.cache.ehcache.config

其次,您无法依赖@PostConstruct中的该功能,因为无法确保所有后期处理都已完成(对于几乎每个拦截器都是如此,{{3 }})。

尝试将该代码移至afterSingletonInstantiated(来自SmartInitializingSingleton界面)。如果您不想这样做,另一个想法是将该代码移动到应用程序完全加载时调用的事件监听器:

@EventListener(ContextRefreshedEvent.class)
public void yourCacheStuff() {
   ///
}