您的位置:首页 > 其它

Hibernate入门(三)之hibernate 的session的缓存机制

2016-05-08 14:26 260 查看

session缓存

缓存的生命周期

当打开session以后,该缓存就开始了,当session关闭以后,该缓存不存在,其生命周期和session的生命周期是一样的


如何将数据存放到缓存中

get方法

session.get方法可以把一个对象放入到session的缓存中,以主键标识该对象,所以我们把这样的主键也叫oid


save方法

Session.save方法可以把对象放入到缓存中


update方法

session.update方法把对象放入到了session缓存中


如何测试缓存中是否有数据



说明:可以利用session.getStatistics()方法统计出放入到session缓存中的对象的个数

如何清除缓存中的数据

clear方法(清除所有的缓存数据)



evict方法(清除指定的缓存数据)



close方法(清除所有的缓存数据)

session关闭,缓存也就不存在了,session中的数据也就被清除了

不同的session



说明:

103行的代码中的session和107行代码中的session是完全不一样的

也就是说每次用factory.opensession这个session都是不一样的

如何将数据库中的数据同步到缓存中



当执行117行代码的时候,发出了sql语句 session.get方法

当执行119行代码的时候,又发出了sql语句 session.refresh

把数据库中的数据同步到缓存中

如何将缓存中的数据同步到数据库中

Session.flush方法会去检查session缓存中各个对象的状态,如果该对象由临时状态转换过来的(没有主键值),则会让该对象生成一条insert语句,如果该对象有主键值,则会对照副本,决定是否发出update语句。当事务提交的时候,如果不显式的写session.flush的情况下,这个时候hibernate内部会默认的执行session.flush。

缓存的意义1

传统从数据库中获取数据的做法



这样每次获取一次数据都要从数据库中获取,这样的效率很低下,但如果使用缓存机制的话就不一样了



说明:
在内存区域中,有一个对象Map<String,List<T>>,key值为sql语句,value值为该sql语句执行的结果,在客户端发出一个sql语句:
1、先从map中检查是否key值和该sql语句一样
2、如果一样,则从map提取数据,和数据库没有关系
3、客户端从map中得到相应的数据
4、第二步,如果不一样,则从数据库中查询
5、把查询出来的结果缓存到map中
6、把结果返回到客户端一份


缓存的意义2



Session的缓存提供了存放对象的容器,在这个容器中可以对对象随意操作,但是在执行session.flush的时候,hibernate内部会根据每一个对象的状态来决定发出insert语句还是update语句。这样在整个过程中,和数据库只交互一次,通过这样的方式可以提高效率
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: