Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率问题,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两种缓存,合理的使用缓存策略可以大大提高我们的操作数据效率,但是利用不能,可能会造成不必要的麻烦。

一,一级缓存(Session缓存):

Session缓存表示将查询结果放置到Session的临时存储空间(一级缓存中)。Hibernate框架默认支持一级缓存的。一级缓存的范围较小,一旦Session关闭,那么缓存失效。我们使用框架的各种方法,例如:get,load,save,update,delete等都支持一级缓存的。

二,二级缓存(SessionFactory缓存):

1,概述:二级缓存其实就是将查询的数据放置在SessionFactory临时存储空间中,因为一个SessionFactory可以创建多个Session对象,所以范围比Session缓存的要大,多个Session可以共享二级缓存的数据。当然了二级缓存也不能存储大量的数据,这个要根据我们电脑配置进行设置。

2,如何设置使用二级缓存呢?Hibernate默认是不支持二级缓存的。

a,首先在hibernate.cfg.xml配置文件中添加属性标签,启用二级缓存:

<!--启用二级缓存 -->

<propertyname="hibernate.cache.use_second_level_cache">true</property>

b,二级缓存需要使用额外的第三方组件:ehcache。需要我们拷入对应的jar包,以及将对应的ehcache.xml存放到src目录下。在这个配置文件中,我们可以设置二级缓存的大小等。

c,让框架识别添加入的ehcache缓存组件,在hibernate.cfg.xml配置文件中添加属性标签:

<!--让框架识别ehcache缓存组件 -->

<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

d,设置需要缓存的映射类,这里只是将一些查询操作比较频繁的类指定即可,哪些不经常操作的数据,是没有必要利用缓存的。这里例如:

<!-- 将指定的类存放到二级缓存中,其中read-only是指放入缓存的数据是只读的-->

<class-cache usage="read-only" class="com.ljh.hibernate.pojo.Student"/>

3,缓存的操作数据原理:

查询数据时,会首先从一级缓存中取数据,如果取上,则直接使用,否则到二级缓存中取,如果取到则直接使用,否则,就会发送语句查询数据库。这样利用一级和二级缓存会提高访问效率。

当然使用二级缓存要慎重,要考虑数据的操作频繁性,服务器的硬件配置,数据的安全性等等方面,这样才能很好的利用二级缓存,提高我们操作数据的效率,否则使用不当就会带来不必要的麻烦。

三,Lazy(懒加载),因为感觉Lazy也用到了缓存,可能放到这里不太合理吧。在前边我们已经设计到了lazy了,这里简单总结一下。

1,lazy(Hibernate的延迟加载功能):表示查询当前对象或关联对象数据时,不真正访问数据库,当使用对象非主键属性时,才真正发送查询语句,访问数据库。由于在某些情况下,查的数据在后续流程到可能用不上,如果做查询处理就多余了,所以延迟加载功能可以提高性能,合理使用即可。当然了Hibernate框架是通过Cglib代理来完成延迟加载功能的扩展的。

2,用到lazy地方总结,这里只是对类和映射的地方简单总结了一下,在实际运用中我们还要学会恰当的选择:

标签

起作用到什么地方

取值解释

<class>

针对load方法

true  :  延迟加载  (默认)

false :         禁用延迟加载

<set>

针对于一对多,多对多

true  : 延迟加载 (默认)

false : 禁用延迟加载

extra :        支持延迟加载,在访问集合自身信息时可以发送高效的查询语句。(推荐)

<many-to-one>

针对于多对一,一对一

false : 禁用延迟加载

proxy : 延迟加载  (默认)

no-proxy : 支持延迟加载,不使用cglbi代理的方式完成延迟加载。通过第三方的字节码增强工具。

<one-to-one>

针对一对一

和<many-to-one>标签一样,这里需要注意:

一对一的主键关联映射,根据主动方(不含外键)查询被动方(既是主键,又是外键)时不支持延迟加载的。

3,遇到的问题:lazy,延迟加载功能是运用的一级缓存,也就是利用的是session的内存,一般情况下,我们在用完session后会进行关闭,但是关闭后我们就无法进行延迟查询数据了,也就是说,延迟加载功能就将失效,剖出异常:No
Sesssion,所以这是需要我们解决的。

4.NoSession异常的解决:

a,解决原理:我们可以在dao层不进行session的关闭,通过前边学习的AOP编程思想,添加过滤器,在视图层进行数据取完毕后进行关闭session,这样就可以解决了NoSession异常了。但是怎么获取呢?这里又想到了前边学习的ThreadLocal,我们可以将Session对象放到Threadlocal对象中,和线程进行绑定,到视图层再通过ThreadLocal进行获取关闭即可。

b,解决方案,AOP编程思想,想必都想到了Spring框架了吧,的确,Spring框架提供了OpenSessionInViewFilter过滤器解决NoSession异常,这里我们只需要配置一下即可。在web.xml中进行此过滤器的配置即可:

  1. <!-- 过滤器需要配置在Struts2框架过滤器前面,否则不起作用。 -->
  2. <filter>
  3. <filter-name>OpenSessionInViewFilter</filter-name>
  4. <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7. <filter-name>OpenSessionInViewFilter</filter-name>
  8. <url-pattern>/*</url-pattern>
  9. </filter-mapping>

c,配置的顺序问题,应该将openSessionInViewFilter配置到Struts2的流程前边,这是因为Filter执行顺序是从上向下的,而且Struts2框架的执行流程基本上包含了整个项目顺序的全部流程,MVC流程框架么,就体现在这里了。配置到Struts2框架的流程后边的过滤器是起不到作用的。

这些是Hibernate框架中重要的知识,我们可以通过合理使用缓存和lazy机制,使我们的程序变得性能更加强,考虑优化项目时,这两项是必须要考虑的。这些东西看起来是比较虚的内容,还需要我们通过一些小例子和实际应用加深理解。


最新文章

  1. quartz_jobs.xml标准配置
  2. Cannot find class for bean with name &#39;/hello&#39; defined in ServletContext resource
  3. The error occurred while setting parameters--索引 3 超出范围 sqlserver2008
  4. 快速幂 --- CSU 1556: Jerry&#39;s trouble
  5. 【poj1015】 Jury Compromise
  6. php ajax json jquery 记录
  7. FPGA设计—UVM验证篇 Hello world
  8. 工作记录8:iOS 传值问题总结(7种传值完美介绍)
  9. ##DAY6 UIScrollView
  10. JVM总结之命令行工具
  11. /etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc ~/.bash_logout 说明及区别
  12. ul中li居中显示的table方法
  13. [BZOJ]4805: 欧拉函数求和
  14. 【Linux驱动】字符设备驱动
  15. 关于java中的锁(转)
  16. 寻找 IBatisNet 批量插入(批量复制) 的心路历程
  17. ECNU 3263 - 丽娃河的狼人传说
  18. lnmp搭建环境易错误点
  19. DotNetBar的使用—(界面风格)
  20. java基础---JDK、JRE、JVM的区别和联系

热门文章

  1. 分布式存储ceph---ceph osd 故障硬盘更换(6)
  2. Scala 关键字
  3. 常用数据库连接池配置及使用(Day_11)
  4. android设置时钟
  5. DDD划分领域、子域,核心域,支撑域的目的
  6. GPU与显卡
  7. 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库
  8. 用TensorRT针对AArch64用户的交叉编译示例
  9. C++标准模板库(STL)——map常见用法详解
  10. Spring Cloud10:Zipkin 服务跟踪