2017-04-14 201 views
0

我目前在我的springboot应用程序(版本1.5.2.RELEASE)中使用hibernate二级缓存hazelcast 3.7.5。 每当我使用由Spring Data Jpa实现的findAll()方法时,hibernate会从数据库中检索数据,但是当我使用findOne(id)方法时,hibernate会从tha chache中获取数据。有人能解释这种奇怪的行为吗? 这里是我的Hibernate配置springboot + hazelcast + hibernate的findAll()从数据库缓存中取回数据不缓存

spring: 
datasource: 
    url: jdbc:h2:file:./target/h2db/db/parametrage;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS PARAM 
    username: sa 
    password: 
jpa: 
    open-in-view: false 
    show-sql: true 
    hibernate: 
     ddl-auto: none 
     naming: 
      implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl 
      physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 
    properties: 
     hibernate.default_schema: PARAM 
     hibernate.id.new_generator_mappings: true 
     hibernate.cache.use_second_level_cache: true 
     hibernate.cache.use_query_cache: false 
     hibernate.generate_statistics: true 
     hibernate.cache.region.factory_class: com.hazelcast.hibernate.HazelcastCacheRegionFactory 
     hibernate.cache.hazelcast.instance_name: hazelcast 
     hibernate.cache.use_minimal_puts: true 
     hibernate.cache.hazelcast.use_lite_member: true 

这里是我的hazelcast配置

@Configuration 
@EnableCaching 

public class CacheConfiguration { 

private final Logger log = LoggerFactory.getLogger(CacheConfiguration.class); 

private final Environment env; 

public CacheConfiguration(Environment env) { 
    this.env = env; 
} 

@Bean 
public CacheManager cacheManager(HazelcastInstance hazelcastInstance) { 
    log.debug("Starting HazelcastCacheManager"); 
    CacheManager cacheManager = new HazelcastCacheManager(hazelcastInstance); 
    return cacheManager; 
} 

@PreDestroy 
public void destroy() { 
    log.info("Closing Cache Manager"); 
    Hazelcast.shutdownAll(); 
} 

@Bean 
public HazelcastInstance hazelcastInstance() { 
    log.debug("Configuring Hazelcast"); 
    Config config = new Config(); 
    config.setInstanceName("hazelcast"); 
    config.getNetworkConfig().setPort(5701); 
    config.getNetworkConfig().setPortAutoIncrement(true); 

    config.getNetworkConfig().getJoin().getAwsConfig().setEnabled(false); 
    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); 
    config.getNetworkConfig().getJoin().getTcpIpConfig().addMember("localhost").setEnabled(true); 

    config.getMapConfigs().put("default", initializeDefaultMapConfig()); 
    config.getManagementCenterConfig(). 
    setUrl("http://localhost:8080/mancenter") 
    .setEnabled(true); 

    return Hazelcast.newHazelcastInstance(config); 
} 

private MapConfig initializeDefaultMapConfig() { 
    MapConfig mapConfig = new MapConfig(); 
mapConfig.setBackupCount(0); 

    mapConfig.setEvictionPolicy(EvictionPolicy.LRU); 


    mapConfig.setMaxSizeConfig(new MaxSizeConfig(0, MaxSizeConfig.MaxSizePolicy.USED_HEAP_SIZE)); 

    return mapConfig; 
} 
} 

,并在最后这里是一个实体

@Entity 
@Table(name = "Banque") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 

public class Banque implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 

@Column(name = "Code") 
private Integer code; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 150) 
@Column(name = "Designation") 
private String designation; 
@OneToMany(mappedBy = "codeBanque") 
@JsonBackReference 
private Collection<Societe> societeCollection; 

public Banque() { 
} 

public Banque(Integer code) { 
    this.code = code; 
} 

public Banque(Integer code, String designation) { 
    this.code = code; 
    this.designation = designation; 
} 

public Integer getCode() { 
    return code; 
} 

public void setCode(Integer code) { 
    this.code = code; 
} 

public String getDesignation() { 
    return designation; 
} 

public void setDesignation(String designation) { 
    this.designation = designation; 
} 

public Collection<Societe> getSocieteCollection() { 
    return societeCollection; 
} 

public void setSocieteCollection(Collection<Societe> societeCollection) { 
    this.societeCollection = societeCollection; 
} 

@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (code != null ? code.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    // TODO: Warning - this method won't work in the case the id fields are not set 
    if (!(object instanceof Banque)) { 
     return false; 
    } 
    Banque other = (Banque) object; 
    if ((this.code == null && other.code != null) || (this.code != null && !this.code.equals(other.code))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "com.csys.parametrage.domain.Banque[ code=" + code + " ]"; 
} 

}

+0

的代码你'use_query_cache'假 –

+0

我“V切换,但仍是同样的问题 –

+0

你可以发布更多的细节,那么请? 'pom.xml'加上任何其他配置文件,如'hibernate.cfg.xml','persistence.xml'。这或全副本样本将帮助 –

回答

0

解决的办法是,像尼尔·史蒂文森在他的评论中说,使用查询缓存。 要做到这一点,我将hibernate.cache.use_query_cache转换为true,但是我也指定要休眠哪些查询必须使用@QueryHints进行缓存。 这里是我的仓库

Repository("BanqueRepository") 
public interface BanqueRepository extends JpaRepository<Banque, Integer> { 

public Banque findByCode(Integer code); 

@Override 
@QueryHints({ 
    @QueryHint(name = "org.hibernate.cacheable", value = "true")}) 
public List<Banque> findAll(); 
} 
0

我得到的一个例子这工作。您需要缓存集合。 我改变

@OneToMany(mappedBy = "codeBanque") 
private Collection<Societe> societeCollection; 

@Cache (usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
@OneToMany(fetch = FetchType.EAGER, mappedBy = "codeBanque") 
private Collection<Societe> societeCollection; 
+0

我的目的是要获得“银行”的名单 –

+0

我找到一个解决方案,谢谢你的第一条评论:)谢谢你man:D –