hibernate二级缓存初学,提问

eg366 2010-01-10 11:29:44
我是照着网上的一个视频教程来学习的。讲到二级缓存这块,有点不明白,二级缓存用的是oscache,配置什么的都没有问题,我按照视频上的方法可以看到被缓存的效果,但我另外写了一个方式,就不可以了,所以问一下。
----------——
视频中的方式
----------——

static void getMember2(int id) {
Session session = null ;
try {
session = HibernateUtil.getSession();

/* 第一次:在session中没有找到,所以在数据库中查找,会打印sql */
Member m = (Member)session.get(Member.class, id);
System.out.println(m.getClass());
} finally {
if(session != null) {
session.close();
}
}

try {
session = HibernateUtil.getSession();

/* 第二次:在session中没有找到,但在二级缓存中找到了,不打印sql */
Member m = (cMember)session.get(Member.class, id);
System.out.println(m.getClass());
} finally {
if(session != null) {
session.close();
}
}
}

主方法中,还写了以下代码:
/* 获取统计信息 */
Statistics st = HibernateUtil.getSessionFactory().getStatistics();
System.out.println(st);
可以看到,second level cache hits=1,二级缓存命中一次的提示。到这里都没有问题,和视频教程中是一样的。
说明配置上是没有问题的吧。

**********************************************
后来我换了种方式写就不行了

static Member getMember(int id) {
Session session = null ;
try {
session = HibernateUtil.getSession();

/* 第一次:在session中没有找到,所以在数据库中查找,会打印sql */
Member m = (Member)session.get(Member.class, id);
System.out.println(m.getClass());

/* 本句将p对象在session删除(一级缓存中已经没有了)*/
session.evict(m);

/* 第二次:在session没有找到,但在二级缓存中找到了,不会打印sql【我是这么想的,可是后台还是打印sql了】 */
Member m2 = (Member)session.get(Member.class, id);
System.out.println(m2.getName());

return m;
} finally {
if(session != null) {
session.close();
}
}
}

在上面这个程序中,“第二次”的时候:后台又打印了一遍sql。不清楚是为什么。
我看统计信息:second level cache puts=1,second level cache hits=0,second level cache misses=2
说明二级缓存已经put Member这个对象一次了,然而命中次数为0。
这块不明白,还望帮着解答一下。说明一下:参数id都为1,数据库中存在为“1”的记录
...全文
69 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
eg366 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tzsword 的回复:]
load()方法可以充分利用二级缓存和内部缓存的现有数据,
get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找
[/Quote]
哦,谢谢。
那为什么第一个程序中,打印 second level cache hits=1 说二级缓存命中了一次啊?
eg366 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 warison2008 的回复:]
get从来不会使用缓存信息,直接从数据库里面查询数据
你应该使用load
[/Quote]
那 第一段程序中的 “第二次” 为什么 不打印sql啊?
而且也打印 second level cache hits=1,,说明二级缓存命中了一次啊。
TzSword 2010-01-10
  • 打赏
  • 举报
回复
load()方法可以充分利用二级缓存和内部缓存的现有数据,
get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找
TzSword 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 warison2008 的回复:]
get从来不会使用缓存信息,直接从数据库里面查询数据
你应该使用load
[/Quote]
+1
道光2008 2010-01-10
  • 打赏
  • 举报
回复
get从来不会使用缓存信息,直接从数据库里面查询数据
你应该使用load
eg366 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tzsword 的回复:]
引用 3 楼 tzsword 的回复:
load()方法可以充分利用二级缓存和内部缓存的现有数据,
get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找

这个是Hibernate3.2以前的结论...........
[/Quote]
哦,好的,谢谢。我用的是3.3.2。
谢谢,至少打开了思路,细节我再查查
TzSword 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 eg366 的回复:]
引用 3 楼 tzsword 的回复:
load()方法可以充分利用二级缓存和内部缓存的现有数据,
get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找

哦,谢谢。
那为什么第一个程序中,打印 second level cache hits=1  说二级缓存命中了一次啊?
[/Quote]
session.evict(m);//感觉这一句阻止了该Session下的该对象去利用缓存....

你在这一句下面在定义一个Session 就应该读缓存了...
TzSword 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tzsword 的回复:]
load()方法可以充分利用二级缓存和内部缓存的现有数据,
get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找
[/Quote]
这个是Hibernate3.2以前的结论...........

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧