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语句。这样在整个过程中,和数据库只交互一次,通过这样的方式可以提高效率
时间: 2024-10-05 12:43:30