您的位置:首页 > 其它

hibernate的一级缓存和二级缓存

2015-03-11 20:39 218 查看

最近在看hibernate的内层实现,说到内层实现就要说到反射和hibernate的缓存机制。今天看到一位大神的博客写得很好,果断转载过来。

在这提供链接

点击打开链接

hibernate有session缓存和sessionFactory缓存两种形式

一、session缓存(又称为事物缓存),是hibernate内置的,不可卸除

缓存范围:session缓存数据只能被当前session对象访问,缓存生命周期依赖于session生命周期。

当session对象调用save()方法来保存一个对象的时候,数据会放入缓存中,当session对象调用get()、load()方法时,数据也会被放进session的缓存对象中。

二、sessionFacotry(又称应用缓存),使用第三方插件,可拔插

缓存范围:sessionFactory缓存可以被应用中的任何session访问,不同的session可共享缓存,缓存生命周期依赖于应用的生命周期。

测试一级缓存:

class test_Level_first_cache{

public Static void main(String[] args){

Session session=hibernateUtil.getSessionFactory().openSession();

Transaction tx=null;tx=session.beginTransaction();

//从数据库中取出id为1的test对象

Test test=(Test)session.get(Test.class,"1");

system.out.println("test.getName()");

Test test1=(Test)session.get(Test.class,"1");

system.out.println("test1.getName()");

}

}

输出结果发现第一次hibernate发出检索看缓存里面是否有id为1的数据,发现没有,hibernate个数据库直接发送select语句,

查出结果,将数据放入session缓存中,

当我们再调用get()方法查找id为1的数据的时候,hibernate发现在缓存中有这条数据,

直接取出这个对象,所以前后两次get()的是同一个对象。

什么时候用二级缓存,用二级缓存的适用条件:

1)经常被访问;

2)不会被经常改动,改动不大;

3)数量有限;

二级缓存实现原理:

当hibernate得到数据库数据的时候,将数据放入缓存中,缓存和map差不多,有自己的oid相当于map中的key,

和对应特定的对象相当于map中的value,当将数据放入缓存中时,hibernate将数据的oid放入key中,

而pojo(简单java对象)放入value中,当下一次hibernate检索缓存时,hibernate通过oid检索一级缓存,当有二级缓存时则检索二级缓存,

若都没用检索到则直接给数据库发送select语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: