hibernate 缓存
hinernate有一级缓存和二级缓存
- 一级缓存: session级别,hibernate自带的,每一个持久化的实例都有唯一的OID
session.beginTransaction(); UserModel us = (UserModel) session.get(UserModel.class,"4028fa816d007b26016d007b2b620000"); System.out.println(us); us = (UserModel) session.get(UserModel.class,"4028fa816d007b26016d007b2b620000"); System.out.println(us);
控制台输出:
Hibernate: select usermodel0_.id as id1_2_0_, usermodel0_.name as name2_2_0_, usermodel0_.age as age3_2_0_ from tblUser usermodel0_ where usermodel0_.id=?
com.hibernate.cache.UserModel@2bdd8394
com.hibernate.cache.UserModel@2bdd8394
第一次调用get方法的时候,从数据库里面查询出一条记录,放到一级缓存里面;第二次get的时候,先从缓存中去查看是否有该对象,如果存在的话,直接从缓存里面取。
清楚缓存的方法有 1. session.evit(obj) , 2. session.clear() 清楚所有的缓存 3. session.close()
session.beginTransaction(); UserModel us = (UserModel) session.get(UserModel.class,"4028fa816d007b26016d007b2b620000"); System.out.println(us); session.clear(); //session.evit(us) us = (UserModel) session.get(UserModel.class,"4028fa816d007b26016d007b2b620000"); System.out.println(us);
控制台输出:
Hibernate: select usermodel0_.id as id1_2_0_, usermodel0_.name as name2_2_0_, usermodel0_.age as age3_2_0_ from tblUser usermodel0_ where usermodel0_.id=?
com.hibernate.cache.UserModel@2bdd8394
Hibernate: select usermodel0_.id as id1_2_0_, usermodel0_.name as name2_2_0_, usermodel0_.age as age3_2_0_ from tblUser usermodel0_ where usermodel0_.id=?
com.hibernate.cache.UserModel@47c81abf
list() 和 iterate 问题:
session调用list() 查询列表的时候会发出一条sql,调用iterate()查询列表的时候会发出一条sql取id,查询对象的属性时,再发出一条sql取对象信息
UserModel us = (UserModel)session.createQuery(" from UserModel ").iterate().next(); System.out.println(us.getName()); us = (UserModel)session.createQuery(" from UserModel ").iterate().next(); System.out.println(us.getName());
控制台输出:
Hibernate: select usermodel0_.id as col_0_0_ from tblUser usermodel0_
Hibernate: select usermodel0_.id as id1_2_0_, usermodel0_.name as name2_2_0_, usermodel0_.age as age3_2_0_ from tblUser usermodel0_ where usermodel0_.id=?
8888
Hibernate: select usermodel0_.id as col_0_0_ from tblUser usermodel0_
8888
输出共有三条sql,2条取id的sql(一级缓存不会缓存属性),一条取对象信息的sql,并且放入了一级缓存里面。