【问题标题】:Hibernate Second level cache doesn't work休眠二级缓存不起作用
【发布时间】:2016-06-23 19:06:44
【问题描述】:

我有点卡住,无法理解我的二级缓存配置有什么问题。 pom文件

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.12</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.11.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>4.3.11.Final</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.36</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>4.3.11.Final</version>
    </dependency>
</dependencies>

hibernate.cfg.xml:

<property name="show_sql">true</property>
 <property name="format_sql">true</property>
 <property name="use_sql_comments">true</property>
 <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
 <property name="hibernate.c3p0.min_size">5</property>
 <property name="hibernate.c3p0.max_size">100</property>
 <property name="hibernate.c3p0.timeout">1800</property>
 <property name="hibernate.c3p0.max_statements">50</property>
 <property name="hibernate.c3p0.idle_test_period">3000</property>   
 <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</property>
 <property name="hibernate.cache.use_second_level_cache">true</property>
 <property name="hibernate.cache.use_query_cache">true</property>
 <property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property> 

ehcache.xml 文件

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

 <defaultCache maxElementsInMemory="100" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="200" />    

<cache
    name="version2Cache"
    maxElementsInMemory="100000"
    eternal="true"
    overflowToDisk="false"
    memoryStoreEvictionPolicy="LFU"
    statistics="true"
/>
</ehcache>   

实体:

@Entity
@Table(name = "version")
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region="version2Cache")
public class VersionData implements Serializable
{

    /**
     * 
     */
    private static final long serialVersionUID = 7355281418627668744L;

    @Id 
    @Column(name="VERSION_ID")  
    private String versionId;



    /**
     * user docname
     */
    @Column(name = "DOC_NAME")
    private String docName; 


    /**
     * user versionModivied
     */
    @Column(name = "VERSION_MODIFIED")
    @Type(type = "timestamp")
    @JsonIgnore
    private Date versionModivied;
    /**
     * user zvitId
     */
    @ManyToOne
    @JoinColumn(name="ZVIT_ID")
    private ZvitData zvitId;

    @OneToMany(targetEntity=TermData.class, mappedBy = "versionId", cascade=javax.persistence.CascadeType.ALL, fetch=FetchType.LAZY)
    private List<TermData> terms;
//getters, setters, hashcode, equals
}

然后我运行单元测试

@Test
    public void testCache() throws ReportException
    {
        SessionFactory sessionFactory = ReportsFactory.getSessionFactory();
        Session session = sessionFactory.openSession();
        VersionData versionData = (VersionData) session.load(VersionData.class, "1");
        System.out.println(versionData.getDocName());
        session.close();

        session = sessionFactory.openSession();
        versionData = (VersionData) session.load(VersionData.class, "1");
        System.out.println(versionData.getDocName());
        session.close();
    }

我在控制台中看到实际上有两个查询在数据库中运行,但是使用二级缓存应该有一个。

编辑: 谢谢你 Madhusudana Reddy Sunnapu。我的错误是我没有正确阅读控制台消息:( 我没有缓存嵌入式对象。看起来查询工作了两次。但第二次它并没有真正加载 VersionData,而是查询嵌入的对象。我错过了。很抱歉给您添麻烦。这真是我的愚蠢错误:(

【问题讨论】:

  • 你在.hbm.xml文件上使用过吗???
  • @Evgen 我没有看到配置有任何问题。你能在你看到两个查询的地方显示控制台输出吗?
  • 我在我的实体 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region="version2Cache") 中声明了缓存使用情况。我没有其他地方可以设置它
  • @Evgen 很高兴有帮助。 :)

标签: java hibernate second-level-cache


【解决方案1】:

您应该添加此内容并重试您的测试。或许你会得到答案。

<ehcache>
     ....
     ....
     //your Code
     .....
     .....
    <cache name="package.Name.VersionData"   
        maxElementsInMemory="100"   
        eternal="false"   
        timeToIdleSeconds="5"   
        timeToLiveSeconds="200" />  
    </ehcache>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 2023-03-03
    • 2019-04-02
    • 2017-07-05
    • 2011-07-08
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多