yushanyigong 2008-11-11 05:37
浏览 165
已采纳

hibernate 查询缓存 和 二级缓存 的使用是否与查询的条件有关?

前提条件是 hibernate 中 查询缓存 和 二级缓存 已经配置成功(使用的是EHCache);且在不同的session中用相同的查询语句(使用Query中的list),则查询缓存和二级缓存得到使用;然而当改变第二个session中的查询语句时未用到第一个session中的缓存?问是否hibernate的 查询缓存 和 二级缓存 的使用是否与查询的条件有关?
这是我的测试代码:
[code="java"]
public void testCache3(){
Session s = HibernateUtils.getSession() ;
s.beginTransaction() ;

    Query query = s.createQuery("from User") ;
    query.setCacheable(true) ;
            [color=darkred]//第一次查询会发出sql[/color]
    List list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;

    System.out.println("------------------------------------") ;

    s = HibernateUtils.getSession() ;
    s.beginTransaction() ;

    query = s.createQuery("from User u where u.name like 'yu9%'") ;
    query.setCacheable(true) ;
            [color=darkred]//改变查询条件时,也发出sql,为什么不是从上面的缓存中读取呢?[/color]
    list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;

   System.out.println("------------------------------------") ;

    s = HibernateUtils.getSession() ;
    s.beginTransaction() ;

    query = s.createQuery("from User u where u.name like 'yu9%'") ;
    query.setCacheable(true) ;
            [color=darkred]//与上一个的查询条件相同,不发出sql[/color]
    list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;
}

[/code]

请问是否查询缓存 只对相同的查询条件才能其作用? 还有就是 相同的查询条件,第一次用Query中的list ,第二次用Critera中的list也不能使用第一次的缓存,为何谢谢?
[b]问题补充:[/b]
前提条件是 hibernate 中 查询缓存 和 二级缓存 已经配置成功(使用的是EHCache);且在不同的session中用相同的查询语句(使用Query中的list),则查询缓存和二级缓存得到使用;然而当改变第二个session中的查询语句时未用到第一个session中的缓存?问是否hibernate的 查询缓存 和 二级缓存 的使用是否与查询的条件有关?
这是我的测试代码:
[code="java"]
public void testCache3(){
Session s = HibernateUtils.getSession() ;
s.beginTransaction() ;

    Query query = s.createQuery("from User") ;
    query.setCacheable(true) ;
            [color=darkred]//第一次查询会发出sql[/color]
    List list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;

    System.out.println("------------------------------------") ;

    s = HibernateUtils.getSession() ;
    s.beginTransaction() ;

    query = s.createQuery("from User u where u.name like 'yu9%'") ;
    query.setCacheable(true) ;
            [color=darkred]//改变查询条件时,也发出sql,为什么不是从上面的缓存中读取呢?[/color]
    list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;

   System.out.println("------------------------------------") ;

    s = HibernateUtils.getSession() ;
    s.beginTransaction() ;

    query = s.createQuery("from User u where u.name like 'yu9%'") ;
    query.setCacheable(true) ;
            [color=darkred]//与上一个的查询条件相同,不发出sql[/color]
    list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;
}

[/code]

请问是否查询缓存 只对相同的查询条件才能其作用? 还有就是 相同的查询条件,第一次用Query中的list ,第二次用Critera中的list也不能使用第一次的缓存,为何谢谢?

那么查询缓存是否可以控制,就像二级缓存一样可以指定缓存数目,生存期等?谢谢
[b]问题补充:[/b]
前提条件是 hibernate 中 查询缓存 和 二级缓存 已经配置成功(使用的是EHCache);且在不同的session中用相同的查询语句(使用Query中的list),则查询缓存和二级缓存得到使用;然而当改变第二个session中的查询语句时未用到第一个session中的缓存?问是否hibernate的 查询缓存 和 二级缓存 的使用是否与查询的条件有关?
这是我的测试代码:
[code="java"]
public void testCache3(){
Session s = HibernateUtils.getSession() ;
s.beginTransaction() ;

    Query query = s.createQuery("from User") ;
    query.setCacheable(true) ;
            [color=darkred]//第一次查询会发出sql[/color]
    List list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;

    System.out.println("------------------------------------") ;

    s = HibernateUtils.getSession() ;
    s.beginTransaction() ;

    query = s.createQuery("from User u where u.name like 'yu9%'") ;
    query.setCacheable(true) ;
            [color=darkred]//改变查询条件时,也发出sql,为什么不是从上面的缓存中读取呢?[/color]
    list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;

   System.out.println("------------------------------------") ;

    s = HibernateUtils.getSession() ;
    s.beginTransaction() ;

    query = s.createQuery("from User u where u.name like 'yu9%'") ;
    query.setCacheable(true) ;
            [color=darkred]//与上一个的查询条件相同,不发出sql[/color]
    list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;
}

[/code]

请问是否查询缓存 只对相同的查询条件才能其作用? 还有就是 相同的查询条件,第一次用Query中的list ,第二次用Critera中的list也不能使用第一次的缓存,为何谢谢?
[b]问题补充:[/b]
前提条件是 hibernate 中 查询缓存 和 二级缓存 已经配置成功(使用的是EHCache);且在不同的session中用相同的查询语句(使用Query中的list),则查询缓存和二级缓存得到使用;然而当改变第二个session中的查询语句时未用到第一个session中的缓存?问是否hibernate的 查询缓存 和 二级缓存 的使用是否与查询的条件有关?
这是我的测试代码:
[code="java"]
public void testCache3(){
Session s = HibernateUtils.getSession() ;
s.beginTransaction() ;

    Query query = s.createQuery("from User") ;
    query.setCacheable(true) ;
            [color=darkred]//第一次查询会发出sql[/color]
    List list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;

    System.out.println("------------------------------------") ;

    s = HibernateUtils.getSession() ;
    s.beginTransaction() ;

    query = s.createQuery("from User u where u.name like 'yu9%'") ;
    query.setCacheable(true) ;
            [color=darkred]//改变查询条件时,也发出sql,为什么不是从上面的缓存中读取呢?[/color]
    list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;

   System.out.println("------------------------------------") ;

    s = HibernateUtils.getSession() ;
    s.beginTransaction() ;

    query = s.createQuery("from User u where u.name like 'yu9%'") ;
    query.setCacheable(true) ;
            [color=darkred]//与上一个的查询条件相同,不发出sql[/color]
    list = query.list() ;
    for(Iterator iter=list.iterator(); iter.hasNext();){
        User user = (User)iter.next() ;
        System.out.println("user.getName ="+user.getName()) ;
    }
    s.close() ;
}

[/code]

请问是否查询缓存 只对相同的查询条件才能其作用? 还有就是 相同的查询条件,第一次用Query中的list ,第二次用Critera中的list也不能使用第一次的缓存,为何谢谢?

那么查询缓存是否可以控制,就像二级缓存一样可以指定缓存数目,生存期等?谢谢

还有一个问题刚才忘问了, 相同的查询条件,第一次用Query中的list ,第二次用Critera中的list也不能使用第一次的缓存,为何谢谢?

展开全部

  • 写回答

5条回答 默认 最新

  • catstiger 2008-11-11 06:25
    关注

    [quote]那么查询缓存是否可以控制,就像二级缓存一样可以指定缓存数目,生存期等?谢谢 [/quote]
    好像不好精确控制,因为你不知道查出来的是什么。
    查询缓存不是很有用,命中的条件太苛刻了,而且出现脏数据的可能性比较大。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥50 关于#php#的问题,请各位专家解答!
  • ¥15 python 3.8.0版本,安装官方库ibm_db遇到问题,提示找不到ibm_db模块。如何解决?
  • ¥15 TMUXHS4412如何防止静电,
  • ¥30 Metashape软件中如何将建模后的图像中的植被与庄稼点云删除
  • ¥20 机械振动学课后习题求解答
  • ¥15 IEC61850 客户端和服务端的通讯机制
  • ¥15 MAX98357a(关键词-播放音频)
  • ¥15 Linux误删文件,请求帮助
  • ¥15 IBMP550小型机使用串口登录操作系统
  • ¥15 关于#python#的问题:现已知七自由度机器人的DH参数,利用DH参数求解机器人的逆运动学解目前使用的PSO算法