前提条件是 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也不能使用第一次的缓存,为何谢谢?