缓存:缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存的数据是在内存中的。
优点:响应数据快
分为一级缓存,二级缓存,查询缓存
一级缓存:默认开启
作用范围:session级缓存,在一个session的生命周期(缓存的是对象,不是集合)
//一级缓存(查询的数据要一样)
City city = session.get(City.class, 1);
System.out.println(city.getCname());
/*
//如果在中间关闭session,它就不是一级缓存
session.close();
session = factory.openSession();
*/
City city2 = session.get(City.class, 1);
System.out.println(city2.getCname());
这是一级缓存,第二次查询的时候,它先内存中找,然后内存中有,就直接拿内存中的,就不会去数据库中查
Hibernate:
select
city0_.CID as CID1_0_0_,
city0_.CNAME as CNAME2_0_0_,
city0_.pid as pid3_0_0_
from
CITY city0_
where
city0_.CID=?
长沙市
长沙市
这不是一级缓存,他还是去数据库查询了两次
select
city0_.CID as CID1_0_0_,
city0_.CNAME as CNAME2_0_0_,
city0_.pid as pid3_0_0_
from
CITY city0_
where
city0_.CID=?
长沙市
Hibernate:
select
city0_.CID as CID1_0_0_,
city0_.CNAME as CNAME2_0_0_,
city0_.pid as pid3_0_0_
from
CITY city0_
where
city0_.CID=?
长沙市
二级缓存:需要手动打开(在hibernate.cfg.xml中配置打开)
作用范围:SessionFactory级缓存,工厂不关闭,缓存就一直在。(缓存的也是对象,不是集合)
在配置文件中
pom.xml
<!-- 二级缓存的配置 -->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.3.10.Final</version>
</dependency>
hibernate.cfg.xml
<!-- 打开二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property>
<!-- 指定哪个实体类用二级缓存-->
<class-cache usage="read-only" class="com.ywy.entity.City"/>
//二级缓存
City city = session.get(City.class, 1);
System.out.println(city.getCname());
//如果session关闭它还是有
session.close();
session = factory.openSession();
City city2 = session.get(City.class, 1);
System.out.println(city2.getCname());
//二级缓存---把工厂关闭就没有,就去数据库查询两次
City city = session.get(City.class, 1);
System.out.println(city.getCname());
//关闭工厂
transaction.commit();
session.close();
//获取工厂
factory=configuration.buildSessionFactory();
session = factory.openSession();
transaction = session.beginTransaction();
City city2 = session.get(City.class, 1);
System.out.println(city2.getCname());
查询缓存
对一个查询对象的缓存(可以缓存对象和集合)
hibernate.cfg.xml
<!-- 打开查询缓存-->
<property name="hibernate.cache.use_query_cache">true</property>
String hql="select c from City c";
Query query=session.createQuery(hql);
//手动打开查询缓存(只能单独设置的一个查询对象)
query.setCacheable(true);
List<City> list=query.list();
for (City city : list) {
System.out.println(city.getCname());
}
Query query2 = session.createQuery(hql);
List<City> list2=query.list();
for (City city : list2) {
System.out.println(city.getCname());
}