Hibernate缓存机制之一级缓存
什么是缓存
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
Hibernate的第一级缓存也就是Session的缓存,它是内置的,是不能被卸载的
证明一级缓存的存在
数据库中有一条Student记录
准备通过get方法连续加载它两次,如果Hibernate底层执行了两次select说明没有缓存,如果执行了一次select说明有缓存,因为bean很简单,配置也很容易,所以那些操作这里就不贴了
测试代码
public void testGet(){ //获取session 对象 Session session = HbnUtils.getSession(); //开启事务 session.beginTransaction(); try { //执行第一次get操作 Student student = session.get(Student.class, 1); //执行第二次get操作 Student student1 = session.get(Student.class, 1); //提交事务 session.getTransaction().commit(); } catch (Exception e) { //回滚事务 session.getTransaction().rollback(); e.printStackTrace(); } }
查看输出日志
select student0_.t_id as t_id1_0_0_, student0_.t_name as t_name2_0_0_, student0_.t_age as t_age3_0_0_, student0_.t_score as t_score4_0_0_ from t_student student0_ where student0_.t_id=?
可以发现确实是查了一次数据库
分析
分析Student student = session.get(Student.class, 1)
这句代码都干了些什么
1)、将数据从DB中取出来
2)、将数据转变成对象,并存入堆内存中
3)、将对象的id放入session缓存map的key中,将对象的引用放入session缓存map的 value中(这就是所谓的一级缓存)
而当进行第二次get时,Hibernate会先到session的map中找是否存在key为1的对象,如果有,就不需要访问数据库,直接返回对应对象的引用。所以上面的程序只查了一次数据库