Hibernate框架基础知识第五天

时间:2023-01-25 15:36:00

第五天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下,修改为以下内容:

Hibernate框架基础知识第五天

配置代码参考:

<?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包拷贝到项目中

注意:如果此时的slf4jjar包提示版本过低(运行的时候),需要将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”,延迟加载关闭。