【问题标题】:Hibernate Query Cache , Behavior is not as expectedHibernate 查询缓存,行为不符合预期
【发布时间】:2015-12-05 21:11:17
【问题描述】:

我刚刚经历了this articlethis,我发现它们可以提高我的应用程序的性能,因为它只有 99% 的读取操作。我首先在测试应用程序中实现它只是为了测试它(参考this),虽然我得到了结果,但根据我提到的第二个链接,如果查询对于 same 参数值是相同的, db 命中将发生,但基于关系的主键

类如下:

实体类

@Entity(name="User_Details")
public class UserDetails {
    @Id
    private String userName;
    private String password;
    private String  name;
    private Long msisdn;
   //getter and setter are in place//
}

DAO 类

public class UserDetailsDAOImpl {

SessionFactory sessionFactory;

public UserDetailsDAOImpl() {
    sessionFactory = new Configuration().configure().buildSessionFactory();
}

public UserDetails getUser(String param1) {
    Session session = sessionFactory.openSession();
    System.out.println("session : " + session);     
    session.beginTransaction();        
    Criteria query =  session.createCriteria(UserDetails.class).add(Restrictions.eq("name",param1));
    UserDetails dummy_user=(UserDetails) query.setCacheable(true).uniqueResult();
    session.close();
    return dummy_user;
}

主类

    UserDetailsDAOImpl obj=new UserDetailsDAOImpl();        
    UserDetails response = obj.getUser("Borat16");  
    System.out.println("Test:"+response);   
    UserDetails response1 = obj.getUser("Borat16"); 
    System.out.println("Test1:"+response1); 

Hibernate.cfg.xml

    <property name="hibernate.cache.use_second_level_cache">true</property>
    <!--<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>-->
     <property name = "hibernate.cache.use_query_cache">org.hibernate.cache.EhCacheProvider</property>
    <property name="show_sql">true</property>
    <property name="hbm2ddl.auto">update</property>

// 第一次查询结果 : 按照文章第一次会命中db(如预期)

Hibernate: select this_.userName as userName1_0_0_, this_.msisdn as msisdn2_0_0_, this_.name as name3_0_0_, this_.password as password4_0_0_ from User_Details this_ where this_.name=?
Test:UserDetails [userName=ak416, password=magnum16, name=Borat16, msisdn=116]

// 第二次查询结果:现在由于查询相同且参数相同,为什么生成的 sql 语句看起来不像“select * from user_details where userName='ak47'。我的意思是应该用 where 参数作为键 命中 db。我错过了什么?!

Hibernate: select this_.userName as userName1_0_0_, this_.msisdn as msisdn2_0_0_, this_.name as name3_0_0_, this_.password as password4_0_0_ from User_Details this_ where this_.name=?
Test1:UserDetails [userName=ak416, password=magnum16, name=Borat16, msisdn=116]

【问题讨论】:

    标签: java spring hibernate postgresql


    【解决方案1】:

    你正在使用

    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
    

    所以你的缓存没有启用 (NoCacheProvider)

    【讨论】:

    • 感谢您指出这一点...我从某个项目中复制粘贴旧配置。你能告诉我要使用什么类..因为我找不到它..即使在注释掉它之后我也得到了相同的结果!!
    • 您不想注释掉。您需要引用一些实现缓存的类。您可以使用“org.hibernate.cache.EhCacheProvider”。有很多关于它的教程。例如:howtodoinjava.com/2013/07/04/… 你需要在你的 pom.xml 文件中提供缓存提供者依赖,并在配置中引用实现类。
    • 非常感谢,我会尽快做的......无论如何......我忘了提到我还添加了(在第二篇文章中提到)这个属性,但我仍然得到相同的结果&lt;property name = "hibernate.cache.use_query_cache"&gt;org.hibernate.cache.EhCacheProvider&lt;/property&gt; ...所以简而言之,我还需要配置cache.provider_class 吗?
    • use_query_cache 是布尔值而不是类。所以是的,你需要设置 provider_class。最好遵循一些完整的教程,做一些工作,然后从那里开始定制。
    • 非常感谢...主要的困惑只是这个..因为这个post提到它作为类和布尔值..
    【解决方案2】:

    此外,一旦您设置了 cache_provider 值,请确保将以下值设置为“true”以启用查询级缓存。

    <property name="hibernate.cache.use_query_cache">true</property>
    

    【讨论】:

    • 这让我很困惑……每秒post..!!..同一个属性设置了两个值。 hibernate.cache.use_query_cache=org.hibernate.cache.EhCacheProvider hibernate.cache.use_query_cache=true
    • 属性“hibernate.cache.use_query_cache”采用布尔值。看起来您错误地将 cacheProvider 值设置为该属性。因此,您需要将此属性“hibernate.cache.use_query_cache”的“org.hibernate.cache.EhCacheProvider”的当前值替换为“true”。
    • 顺便说一下,在最新版本的休眠中,属性“hibernate.cache.provider_class”被“hibernate.cache.region.factory_class”替换。这是区域工厂和 use_query_cache 属性的外观 - org.hibernate.cache.ehcache.EhCacheRegionFactorytruetrue
    猜你喜欢
    • 2011-08-28
    • 2014-06-25
    • 2018-11-18
    • 1970-01-01
    • 2013-10-31
    • 2014-11-28
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多