【发布时间】:2015-04-01 04:44:12
【问题描述】:
所以,我的问题是我不确定我的查询是否被缓存。我现在的hibernate.xml使用ehcache作为二级缓存。
现在这是我的测试代码:
Session session = HibernateUtil.getCurrentSession();
Criteria criteria = session.createCriteria(Users.class);
criteria.add(Restrictions.eq("id", "777008"));
Users user = (Users) criteria.uniqueResult();
HibernateUtil.closeCurrentSession();
Session anotherSession = HibernateUtil.getCurrentSession();
Criteria anotherCriteria = anotherSession.createCriteria(Users.class);
anotherCriteria.add(Restrictions.eq("id", "777008"));
Users anotherUser = (Users) anotherCriteria.uniqueResult();
HibernateUtil.getCurrentSession() 方法在ThreadLocal 变量中检索当前会话(如果可用)。如果会话为空,则创建一个。
HibernateUtil.closeCurrentSession() 从ThreadLocal 变量中获取会话,如果它不为空则关闭它。
每当我运行上面的代码(这是一个 JUnit 测试)时,我只能看到一个从数据库中选择的 Hibernate 日志。我原以为会有两个,因为我没有使用 Criteria.setCaching(true) 强制缓存任何内容。
我相信一级缓存只存在于会话范围内,二级缓存基本上是应用程序缓存。在上述两个criteria.uniqueResult() 调用的中间,我关闭了会话。
我的问题是,为什么我只看到一个 Hibernate SELECT 语句日志?我不应该看到两个吗?
此外,当我转到 hibernate.xml 并禁用二级缓存时,仍然会出现相同的输出,这让我非常困惑。
我看到的 SELECT 语句日志示例:`Hibernate: select this_.id as id8_0_, this_.nameas name8_0_, from users this_ where this_.id=?
编辑:这次我尝试了不同的方法。请参考下面的sn-p代码:
@Test
public void testCaching(){
for (int i = 0; i < 10; i++){
try {
Thread.sleep(3000);
logger.info("Retrieving user.");
Session session = HibernateUtil.getCurrentSession();
Criteria criteria = session.createCriteria(Users.class);
criteria.add(Restrictions.eq("id", "777008"));
criteria.setCacheable(true);
Users user = (Users) criteria.uniqueResult();
}
catch (Exception ex){
System.out.println("Got it");
}
finally{
HibernateUtil.closeCurrentSession();
}
}
}
所以,现在,每次测试调用Criteria.uniqueResult(),它都会显示一个休眠日志。所以现在,我关心的是我是否缓存了任何东西?使用此测试启用二级缓存 (ehcache)。
编辑 2:好的,现在,我有点想通为什么它没有缓存。事实证明,我必须将<cache usage="read-write"/> 放入对象 XML 的 <class> 中。但是,我不能这样做,因为其他应用程序也在使用 XML。有没有办法只在您的应用程序上启用缓存?
【问题讨论】: