第五天Hibernate优化
1.关于缓存的理解。
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
2.Hibernate的缓存。
一级缓存:针对的是session的缓存,关于对session的处理方案:
clear() :Completely clear the session.清空session,该清空操作只对于要保存的、删除的和修改的数据起作用,不涉及查询的结果。
close() :End the session byreleasing the JDBC connection and cleaning up.释放并清空JDBC连接。但是不一定非得关闭session。
flush(): Force this session to flush.强制刷新流的缓冲。flush必须在一个操作单元结束之后且在提交事务和关闭连接之前被调用。例如插入一条数据。
二级缓存:
二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享
二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
二级缓存的配置。
1. 将ehcache.xml文件拷贝到src下,修改为以下内容:
配置代码参考:
<?xml version="1.0"encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<cache name="com.gxa.bj.model.Cate"
eternal="false"
maxElementsInMemory="100"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false">
</cache>
</ehcache>
2.将缓存产品的jar包加入到项目中。如采用的是ehcache的是这个二级缓存。那么将\hibernate-release-4.3.10.Final\lib\optional\ehcache下面的所有jar包拷贝到项目中
注意:如果此时的slf4j的jar包提示版本过低(运行的时候),需要将jre的版本升级为1.7以上的。
3.配置hibernate.cfg.xml文件。
<!-- 启用二级缓存,这也是它的默认配置 -->
<propertyname="hibernate.cache.use_second_level_cache">true</property>
<propertyname="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 指定缓存配置文件位置 -->
<propertyname="hibernate.cache.provider_configuration_file_resource_path">
ehcache.xml
</property>
二级缓存的清理问题:
1.如果需要清理二级缓存。
HibernateSessionFactory.getSessionFactory().getCache().evictEntityRegion(Cate.class);//清理所有二级缓存中的所有的Cate对象的数据
HibernateSessionFactory.getSessionFactory().getCache().evictEntity(Cate.class,2032);//清理所有二级缓存中的主键为2032的Cate对象的数据。
哪些方法所取的数据进入缓存。
get()方法获取的数据是进入到缓存中(首先是从数据库里获取数据,获取数据之后,数据进入到缓存中),get方法会从二级缓存中读取数据。
load()方式是直接从缓存(首先从一级缓存中,如果一级没有,那么就从二级查询,如果二级没有数据,那么就从数据库中查询数据,当数据库中没有数据的时候抛出异常)。
list()方法是不从二级缓存中读取数据的,也不从一级缓存取数据。但是list得到的数据会进入缓存。
iterate()方法虽然是还是会执行从表中取ID的查询,但是查询的数据是从缓存中得到的。如果缓存没有数据,才会从数据库中查询。
关于Hibernate中的抓取策略
1)延迟加载。
在查询数据的时候,那么这个对象的集合属性的数据并不会立马从数据库中查询。比如我们在查询Cate分类的数据的时候,默认情况下,并不会查询Cate分类所对应的产品的数据。
在分类表的映射配置文件中的set节点的配置。默认情况下,
lazy=”true”,延迟加载开启。
Lazy=“false”,延迟加载关闭。