0.说在前面
1.一级缓存
1.1 概念
hibernate默认开启一级缓存,一级缓存是放在session上的.
1.2 新建SessionTest类
packagecom.hibernate.demo.test;importorg.hibernate.SessionFactory;importorg.hibernate.cfg.Configuration;importorg.hibernate.classic.Session;importcom.hibernate.demo.bean.Employee;public classSessionTest {public static voidmain(String[] args) {//加载配置文件,获取会话工厂对象
SessionFactory sessionFactory = newConfiguration().configure().buildSessionFactory();//获取会话对象
Session session1 =sessionFactory.openSession();
Session session2=sessionFactory.openSession();
System.out.println("log1");//根据id获取Employee对象
Employee employee = (Employee) session1.get(Employee.class, 2);
System.out.println("log2");
Employee employee2= (Employee) session1.get(Employee.class, 2);
System.out.println("log3");
Employee employee3= (Employee) session2.get(Employee.class, 2);
System.out.println("log4");//关闭会话对象
session1.close();
session2.close();//关闭会话工厂对象
sessionFactory.close();
}
}
1.3 修改Emplyee.hbm.xml文件,去除Employee与Department的many-to-one关系中的lazy="false"配置,便于查看运行结果
1.4 运行SessionTest类
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
log1
Hibernate: select employee0_.emp_id as emp1_0_0_, employee0_.emp_name as emp2_0_0_, employee0_.dept_id as dept3_0_0_ from t_employee employee0_ where employee0_.emp_id=?log2
log3
Hibernate: select employee0_.emp_id as emp1_0_0_, employee0_.emp_name as emp2_0_0_, employee0_.dept_id as dept3_0_0_ from t_employee employee0_ where employee0_.emp_id=?log4
1.5 总结
从1.4中打印的信息可以看出:
(1)对于同一个Session对象session1来说,由于是第一次根据id去查询Employee对象,还没有缓存信息,所以会发送SQL语句去数据库查询,因此log1与log2之间打印出了发送的SQL信息;当第二次再根据同一个id去获取Employee对象时,由于已经有了缓存信息,所以直接从Session的缓存中获取信息,不再发送SQL去数据库查询,因此log2与log3之间没有打印出发送的SQL信息.
(2)对于不同的Session对象session1和session2来说,缓存信息不共享,所以session2第一次根据同一个id去获取Employee对象,会发送SQL语句去数据库查询,因此log3与log4之间打印出了发送的SQL信息.
2.二级缓存
2.1 概念
(1)hibernate本身不提供二级缓存,都是使用第三方二级缓存插件做支持,这里使用的是EhCache;
(2)二级缓存是作用在SessionFactory上的;
2.2 添加ehcache的jar包,该包是net.sf.ehcache下的---容易下错包
2.3 hibernate.cfg.xml配置二级缓存
/p>
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/keeper?characterEncoding=utf-8
root
123456
org.hibernate.dialect.MySQL5Dialect
true
update
true
org.hibernate.cache.EhCacheProvider
2.4 新建ehcache.xml文件,放在src目录下
/>
2.5 修改Employee.hbm.xml文件,添加缓存配置
/p>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
2.6 运行SessionTest类
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
log1
Hibernate: select employee0_.emp_id as emp1_0_0_, employee0_.emp_name as emp2_0_0_, employee0_.dept_id as dept3_0_0_ from t_employee employee0_ where employee0_.emp_id=?
log2
log3
log4
2.7 总结
从2.6中打印的信息可以看出,只在session1根据id获取Employee对象时发送了SQL去数据库进行查询,session2根据同一个id获取Employee对象时,并没有发送SQL去数据库查询,可见二级缓存起作用了.