环境:
OS : Win XP SP2
Hibernate: 3.5.1
伪代码: [code="java"]
System.out.println(StringUtils.center("query 查询: " ));
Session session = HibernateSessionFactory.getSession();
String hql = "FROM Room T WHERE T.address = ?";
Query query = session.createQuery(hql).setParameter(0, "Shanghai");
query.setCacheable(true);
Room room = (Room) query.list().get(0);
HibernateSessionFactory.closeSession();
System.out.println(StringUtils.center("更新: " ));
Session session2 = HibernateSessionFactory.getSession();
Transaction tx = session2.beginTransaction();
room.setSize(60);
session2.update(room);
tx.commit();
HibernateSessionFactory.closeSession();
System.out.println(StringUtils.center("load查询(已同步缓存): " ));
Session session3 = HibernateSessionFactory.getSession();
room = (Room) session3.load(Room.class, new Long(2));
Hibernate.initialize(room);
HibernateSessionFactory.closeSession();
System.out.println(room.getSize());
System.out.println(StringUtils.center("query 查询(未同步缓存): "));
Session session4 = HibernateSessionFactory.getSession();
query = session4.createQuery(hql).setParameter(0, "Shanghai");
query.setCacheable(true);
room = (Room) query.list().get(0);
HibernateSessionFactory.closeSession();
[/code]
[size=xx-large]hibernate.cache.use_query_cache 和 和 setCacheable(true) 都已配置过
疑问: 两次查询条件都一样, 中间修改了实体, 为什么第二次query查询还是发送了sql, 如果同步了缓存应该不会发送, 请指教. 谢谢.[/size]
参考一下http://www.iteye.com/topic/18904
二级缓存配置的一般配置:对照下是否有遗漏呢?
1、首先要打开二级缓存,在hibernate.cfg.xml中添加如下配置:
true
2、Hibernate的二级缓存使用第三方的缓存工具来实现,所以我们需要指定Hibernate使用哪个
缓存工具。如下配置指定Hibernate使用EhCache缓存工具。
org.hibernate.cache.EhCacheProvider
3、Hibernate在默认情况下并不会对所有实体对象进行缓存,所以,我们需要指定缓存哪些对象,
在实体对象的映射文件中(相应的标签内部),添加如下配置:
usage="read-only"是“只读”缓存策略。
注意,这个标签只能放在标签的内部,而且必须处在标签的前面!!!
这个标签放在哪些标签下面,就说明会多这些类的对象进行缓存
4、对于第3步,有一个可选的方案是在hibernate.cfg.xml文件中指定哪些类的对象需要缓存,
而不需要使用标签来指定。如:
在hibernate.cfg.xml中添加如下配置:
注意,这个标签必须放在标签的后面!!