您的位置:首页 > 其它

Hibernate的二级缓存

2017-08-11 09:56 239 查看
  前边我们讲过了HQL的迫切左外连接和左外连接,即在HQL中使用迫切左外连接的话,那么list方法返回的集合中为对象,且将这个对象中的关联对象都进行了初始化;若是在HQL语句中使用左外连接(返回左表满足连接条件的记录和不满足连接条件的记录)的检索策略,那么list方法返回的集合中存放的是数组对象,且未将关联对象直接初始化。需要注意的是迫切左外连接查询到的结果可能要去重,可用new ArrayList(new
LinkedHashSet())。

  今天我们来讲一个重要的概念:二级缓存

  1.缓存和二级缓存

  ① 缓存

  缓存是介于应用程序内存和永久性数据存储源(如硬盘和数据库)之间的存储数据的介质,缓存中的数据是数据存储源中的拷贝,缓存的物理介质通常是内存(也可以是永久数据源)。

  缓存的功能主要是:减少应用程序访问永久性数据源的频率,从而提高应用程序的性能。

  ②Hibernate中的缓存

  一级缓存:一级缓存是session级别的缓存,属于事务范围内的缓存,这一级别缓存由Hibernate进行管理。

  二级缓存:二级缓存是sessionFactory级别的缓存,属于进程范围的缓存

  二级缓存sessionFactory又可以分为内置缓存和外置缓存:

  内置缓存,是Hibernate自带的,不可卸载的,在Hibernate初始化阶段,Hibernate会将映射元数据(hbm.xml)文件和预定义的SQL语句放入的sessionFactory的缓存中,该内置缓存只可读。

  外置缓存:是一个可配置的缓存插件。默认Hibernate不启用这个插件,外置缓存中的数据时数据库数据的复制,外置缓存的物理介质可以是内存或者硬盘

  ③二级缓存存放的数据选型

  二级缓存中存放的数据应该是不经常修改的,不重要的数据,而不可以是一些重要的类似于财务的数据或者是与其他程序共享的数据。

  3. 二级缓存的并发策略

  当有多个用户同时访问某一个二级缓存时,就可能产生并发的问题,这和数据库的并发问题很类似,如脏读等。所以我们通过设置Hibernate的二级缓存的并发策略来避免这个情况的发生,通常设置为read-write表示类似于数据库中的read-comitted。

  4. 外置二级缓存的插件的使用(eh-cache)

  ① 导入jar包,三个(从hibernate的压缩包中找)

  ② 导入ehcache.xml这个ehcache的配置文件

  ③ 在cfg.xml中启用二级缓存、设置二级缓存的provider即插件、设定可存放于二级缓存的类和集合。

  5. 二级缓存的架构

  ① Cache-provider(缓存插件)

  ehcache

  ② Class Cache Region(类缓存区域)

  将持久化的类放入到二级缓存中

  ③ Collection Cache Region(集合缓存区域)

  可将关联的集合也放入到二级缓存中,需要注意的是必须在cfg.xml文件中将当前类、关联类、当前类的关联类型的属性三者都放入缓存中才可以将关联对象的集合也放入到二级缓存中

  若是不讲集合中类型的类也放入到缓存中,那么结合中存放的仅仅是一个个OID,当需要的时候,还是会从新根据OID去查询。

  ④ Query Cache Region(查询缓存区域)

  默认设置的一级缓存和二级缓存只是对对象导航图和根据OID获取对象有效,而对HQL和QBC都是无效的,我们可以设置来使二级缓存对HQL和QBC的Query和Critirea对象有效。

  在cfg.xml文件中开启查询缓存<property name="cache.use_query_cache">true</proeprty>; 然后再调用Query对象或者Criteria对象的serCacheable(true)方法,使得当前的Query或Criterira对象起作用即可

  需要注意的是,查询缓存必须依赖于二级缓存,即只有当二级缓存开启的时候查询缓存才可以开启使用。

  ⑤ Update Timestamps(更新时间戳区域)

  每操作一次二级缓存中的数据,就会对这个操作记下一个时间点

  时间戳主要是用来判断程序从缓存中拿取对象时,这个对象是否在第一次获取之后进行了修改,若是上一次获取到缓存中之后进行了修改,就重新从数据库拿取对象,若是未修改,就直接从缓存中拿取对象。

  6.ehcache.xml   --ehcache的配置文件(三个节点重点

  ① <diskstore path="">这个几点是来指定当内存中存入的二级缓存的数据超过上限时,需要将二级缓存的数据存入的磁盘的位置。

  ② <defaultCache>指定一个默认的缓存。

  ③ <cache name="">,设置一个具名缓存的过期策略。一个具名的cache节点就代表一个缓存区域,一个缓存块。我们可以指定二级缓存中类或者集合的缓存区域,在hbm.xml的class节点的下一级节点声明< cache name="缓存块的名称">即可。

  ④ cache节点的各个属性:

  maxElementInmemory:二级缓存中可以存在的对象的最大数目

  eternal:设置二级缓存中的对象是否为永久性的对象。true表示永久性的对象。

  timeToIdleSeconds:缓存中对象可空闲的最大时间,0表示可永远空闲。查过空闲时间就从缓存中删除这个对象。

  tiemToLiveSeconds:缓存中对象生存的最大时间,0表示可以永久生存,过期则删除。需要注意的是可生存时间必须大于可空闲时间,二者单位都是秒

  outflowToDisk:设置当内存中缓存对象超出上限时,是否允许将缓存中的对象存入磁盘。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: