yushanyigong 2008-11-11 13: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 14:25
    关注

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

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

报告相同问题?

悬赏问题

  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥20 jupyter保存图像功能的实现
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键