Java Hibernate查询缓存,行为不符合预期

Java Hibernate查询缓存,行为不符合预期,java,spring,hibernate,postgresql,Java,Spring,Hibernate,Postgresql,我刚刚通过了,我发现它将提高我的应用程序的性能,因为它只有99%的读取操作。我首先在测试应用程序中实现了它,只是为了测试它(参考),虽然我得到了结果,但是根据我提到的第二个链接,如果对相同的参数值进行了相同的查询,那么将根据关系的主键进行db hit 课程如下: 实体类 @Entity(name="User_Details") public class UserDetails { @Id private String userName; private String pa

我刚刚通过了,我发现它将提高我的应用程序的性能,因为它只有99%的读取操作。我首先在测试应用程序中实现了它,只是为了测试它(参考),虽然我得到了结果,但是根据我提到的第二个链接,如果对相同的参数值进行了相同的查询,那么将根据关系的主键进行db hit

课程如下:

实体类

@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//
}
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); 
DAO类

@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//
}
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); 
主类

@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//
}
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>
//第二个查询结果:既然查询是相同的参数,为什么生成的sql语句看起来不像“select*from user\u 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]
您正在使用

<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
org.hibernate.cache.internal.NoCacheProvider
因此,您的缓存未启用(NoCacheProvider

您正在使用的缓存

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

因此缓存未启用(NoCacheProvider

设置缓存提供程序值后,请确保将以下值设置为“true”以启用查询级缓存

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

设置缓存提供程序值后,请确保将以下值设置为“true”以启用查询级缓存

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

谢谢你指出这一点……我复制粘贴了某个项目中的旧配置。你能告诉我要使用哪个类吗……因为我找不到它……即使在注释掉它之后,我也得到了相同的结果!!你不想注释掉。你需要引用实现缓存的某个类。你可以使用“org.hibernate.cache.EhCac”有很多关于它的教程。例如:您需要在pom.xml文件中提供缓存提供程序依赖项,并在配置中引用实现类。非常感谢,我会尽快这样做…无论如何..我忘了提到我还添加了(在第二篇文章中提到)这个属性,但我仍然得到相同的结果,
org.hibernate.cache.EhCacheProvider
…所以简而言之,我仍然需要配置
cache.provider\u class
?使用\u query\u缓存是一个布尔值而不是一个类。所以,是的,你需要设置provider\u类。最好遵循一些完整的教程,做一些工作,并开始自定义fr嗯,非常感谢…主要的困惑是这一点…因为它提到了类和布尔值两者…谢谢你指出这一点…我从某个项目复制粘贴旧配置。你能告诉我要使用什么类吗…因为我找不到它…即使在注释了它之后,我也得到了相同的结果!!你不想开始t out。您需要引用一些实现缓存的类。您可以使用“org.hibernate.cache.EhCacheProvider”。有很多关于它的教程。例如:您需要在pom.xml文件中提供缓存提供程序依赖项,并在配置中引用实现类。非常感谢,我会尽快这样做……无论如何……我忘记了我还添加了离子(在第二篇文章中提到)这个属性,但我仍然得到相同的结果,
org.hibernate.cache.EhCacheProvider
…所以简而言之,我仍然需要配置
cache.provider\u class
?使用\u query\u缓存是一个布尔值而不是一个类。所以,是的,你需要设置provider\u类。最好遵循一些完整的教程,做一些工作,并开始自定义from there.Thank alot…主要的混淆是这一点…因为这提到了它是class和boolean两者..这让我很困惑…每秒..!!…同一个属性设置了两个值。
hibernate.cache.use_query\u cache=org.hibernate.cache.EhCacheProvider hibernate.cache.use_query\u cache=true
属性“hibernate.cache.use\u query\u cache“接受一个布尔值。看起来您错误地将cacheProvider值设置到此属性。因此,您需要将此属性“hibernate.cache.EhCacheProvider”的当前值“org.hibernate.cache.EhCacheProvider”替换为“true”。顺便说一句,在最新版本的hibernate属性中“hibernate.cache.provider\u类”替换为“hibernate.cache.region.factory\u类”“。这就是区域工厂的外观,并使用_query_cache属性-org.hibernate.cache.ehcache.EhCacheRegionFactory true这让我很困惑…按秒计算…”。。!!。。同一属性设置了两个值
hibernate.cache.use\u query\u cache=org.hibernate.cache.EhCacheProvider hibernate.cache.use\u query\u cache=true
属性“hibernate.cache.use\u query\u cache”采用布尔值。看起来您错误地将cacheProvider值设置为此属性。因此,您需要将此属性“hibernate.cache.use\u query\u cache”的当前值“org.hibernate.cache.EhCacheProvider”替换为“true”。顺便说一下,在hibernate的最新版本中,属性“hibernate.cache.provider\u class”替换为“hibernate.cache.region.factory\u class”。这是区域工厂的外观,并使用\u query\u cache属性-org.hibernate.cache.ehcache.EhCacheRegionFactory true