1:Hibernate的一级缓存:

  1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率;(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据,如果有数据就不查询数据库,直接从缓存中获取数据);

   1.2:Hibernate中的一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数,只在session范围内有效,session关闭,一级缓存失败;

  1.3:一级缓存的特点,只在session范围有效,作用时间短,效果不是特别明显,在短时间内多次操作数据库,效果比较明显。

  1.4:当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session缓存中;

  1.5:session的缓存是由hibernate维护的,用户不能操作缓存内容;如果想操作缓存内容,必须通过hibernate提供的evict/clear方法操作

  1.6:缓存相关的方法(在什么情况下使用上面方法呢?批量操作情况下使用,如Session.flush();先与数据库同步,Session.clear();再清空一级缓存内容):

    session.flush();让一级缓存与数据库同步;

    session.evict();清空一级缓存中指定的对象;

    session.clear();清空一级缓存中所有的对象;

  1.7:面试题,不同的session是否会共享缓存数据?

      答:不会哦~~~

  1.8:list和iterator的区别?

    (1)list查询:

      答: 一次性把所有的记录都查询出来了;会放入缓存,不会从缓存中取数据;

    (2)iterate(N+1次查询):

      答: N表示所有的记录总数,即会发送一条语句查询所有的记录的主键,这是第一条查询语句,再根据每一个主键取数据库查询,这是根据第一次查询的条数进行N次查询操作;会放入缓存,也会从缓存中取出数据;


2:Hibernate的懒加载:

  2.1:懒加载概念:当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性。

     使用懒加载的目的,是提高程序执行效率。

  2.2:查询操作:get()方法/load()方法

    (1)get()方法,及时加载。及时查询操作;只要调用get方法立刻向数据库查询。

    (2)load()方法,默认懒加载,即在使用数据的时候,才向数据库发送查询的sql语句。session关闭以后,不可以使用懒加载。

#懒加载默认为true,即为懒加载,可以改为非懒加载。即lazy="false"#lazy="false" 关闭懒加载#lazy="true"使用懒加载#lazy="extra"在真正使用数据的时候才向数据库发送查询的sql语句。集合属性懒加载的时候提升效率。如果调用集合的size()/isEmpty()方法只是统计,不真正查询数据。
<class name="类名称" table="数据表名称" lazy="false"> ......
</class>

  2.3:懒加载异常:

    Session关闭后,不能使用懒加载数据,如果session关闭后,使用懒加载数据报错如:

org.hibernate.LazyInitializationException: could not initialize proxy - no Sessionat org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)at com.bie.lesson05.Dept_$$_javassist_1.getDeptName(Dept_$$_javassist_1.java)at com.bie.lesson05.ManyToManyTest.lazyTest(ManyToManyTest.java:241)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

    如何解决session关闭后不能使用懒加载加载数据的问题:

      方式一:可以先在关闭session之前使用一下数据,这样关闭以后就可以使用此数据了。如Dept.getDeptName();

      方式二(推荐):强迫代理对象初始化操作:Hibernate.initialize(对象);

      方式三:关闭懒加载(lazy="false");

      方式四(推荐):在使用数据之后再关闭session;


3:二级缓存:

Hibernate提供的缓存

有一级缓存、二级缓存。 目的是为了减少对数据库的访问次数,提升程序执行效率!

一级缓存:

基于Session的缓存,缓存内容只在当前session有效,session关闭,缓存内容失效!

特点:

作用范围较小! 缓存的事件短。

缓存效果不明显。

  3.1:二级缓存概述:

  二级缓存:

    Hibernate提供了基于应用程序级别的缓存即为二级缓存,可以跨多个session,即不同的session都可以访问缓存数据。 这个缓存也叫二级缓存。

    Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影响代码。

    如果用户觉得hibernate提供的框架框架不好用,自己可以换其他的缓存框架或自己实现缓存框架都可以。  

  3.2:查看hibernate.properties配置文件,二级缓存如何配置?

############################# Second-level Cache ##############################hibernate.cache.use_second_level_cache false【二级缓存默认不开启,需要手动开启】#hibernate.cache.use_query_cache true      【开启查询缓存】## choose a cache implementation 【二级缓存框架的实现】#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProviderhibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider 默认实现#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider

  3.3:二级缓存,使用步骤:

  1) 开启二级缓存;

  2)指定缓存框架;

  3)指定那些类加入二级缓存;

  4)测试;

<!--****************** 【二级缓存配置】****************** -->
<!-- a.  开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- b. 指定使用哪一个缓存框架(默认提供的) -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- c. 指定哪一些类,需要加入二级缓存 -->
<class-cache usage="read-write" class="com.bie.lesson11.Dept"/>
<class-cache usage="read-only" class="com.bie.lesson11.Employee"/>
<!-- 集合缓存[集合缓存的元素对象,也加加入二级缓存] -->
<collection-cache usage="read-write" collection="com.bie.lesson11.Dept.emps"/>

  3.4:缓存策略:

<class-cache usage="read-only"/>     放入二级缓存的对象,只读;
<class-cache usage="nonstrict-read-write"/>  非严格的读写
<class-cache usage="read-write"/>    读写; 放入二级缓存的对象可以读、写;
<class-cache usage="transactional"/>   (基于事务的策略)

Hibernate之一级缓存和二级缓存相关推荐

  1. hibernate之 一级缓存和二级缓存

    2019独角兽企业重金招聘Python工程师标准>>> 缓存 缓存的实现不仅需要作为物理介质的硬件,同时需要管理缓存的并发访问策略和过期策略的程序(软件).所以缓存通常是通过软件和硬 ...

  2. Hibernate 一级缓存,二级缓存,查询缓存

    概念: 1.什么是缓存呢? 缓存:是计算机领域的概念,它介于应用程序和永久性数据存储源之间. 缓存:一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘.用白话来说,就是一个存储数据的容器.我们 ...

  3. Hibernate一级缓存与二级缓存的区别

    一级缓存: 就是Session级别的缓存.一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中. 如果短时间内这个session(一定要同一个session)又做了同一个操作,那么h ...

  4. Hibernate一级缓存、二级缓存以及查询缓存的关系

    转载自http://blog.csdn.net/maoyeqiu/article/details/50209893 前两天总结了一下二级缓存和查询缓存的关系,但是又有一个新的问题,就是查询缓存缓存到二 ...

  5. Hibernate学习(九)———— 二级缓存和事务级别详讲

    序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...

  6. Jpa持久对象状态,一级缓存,二级缓存

    1JPA持久对象的状态 1.1. 临时状态(transient):瞬时状态 刚刚用new语句创建,没有和entityManager发生关系 没有被持久化,不处于entityManager中.该对象成为 ...

  7. 一级缓存和二级缓存的理解

    首先补充下CPU的知识: CPU也就是中央处理器,相当于计算机的大脑: CPU是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit): CPU功能主要是解 ...

  8. mybatis的一级缓存、二级缓存、sqlsession、sqlsessionfactory什么意思?

    mybatis的的一级缓存是SqlSession级别的缓存,一级缓存缓存的是对象,当SqlSession提交.关闭以及其他的更新数据库的操作发生后,一级缓存就会清空. 二级缓存是SqlSessionF ...

  9. hibernate学习之旅之二级缓存

    最近学习的缓存,感觉有了进一步的认识,也感觉到自己只是浅浅的利用缓存,如果真正能够的能够优化hibernate的性能,还需要更加深入(对于项目而言) 好了废话不说了. 讲到Hibernate的二级缓存 ...

最新文章

  1. Windows和linux双系统——改动默认启动顺序
  2. set nocount on
  3. vue用公共组件页面传值_微信小程序页面传值、组件间通信总结
  4. GreenPlum的并行查询优化策略
  5. 计算机集成制造 pdf,计算机集成制造系统方法论9412536127640μ.pdf
  6. 什么叫做java程序中的继承_【Java】基础16:什么叫继承?
  7. 对于早期Servlet内核你清楚吗,这些基础的东西,不能忘哦
  8. java 运行scala_使用java命令运行scala代码
  9. vue-router 修改或添加新参数
  10. 令你的网站获得任意Google PR值的方法!
  11. Win10卸载edge浏览器与后悔重装
  12. Removing a detached instance--删除失败
  13. 多轮对话之对话管理(Dialog Management)
  14. 数据库原理与应用~第三版课后习题答案(何玉洁 编著)
  15. 从软件工程师到有赞新零售技术负责人,34岁李星专访
  16. 怎么在工作中快速学习,获得晋升?——吴军得到直播实录
  17. thinkphp5+php微信公众号二维码扫码关注推广二维码事件实现
  18. 获取华为手机的IMEI和sn号
  19. 微信公众号排查“该公众号提供的服务出现故障,请稍后再试”问题
  20. Apktool|ShakaApktool 简体中文汉化版|APK反编译工具(更新)

热门文章

  1. VC++ 鼠标非显示区域命中测试消息WM_NCHITTEST和相关编程问题学习1
  2. 超图桌面版区分不同类型数据源的图标
  3. C#获取和设置环境变量
  4. 超图iServer重置管理员密码图解
  5. ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
  6. [Codeforces 10E] Greedy Change
  7. 使用Windows的分析等待链(analyze wait chain)来诊断没用响应的应用
  8. 安装显卡驱动后分辨率低的办法
  9. python3转为unicode编码_「小技能get记」· 如何用python3解码unicode
  10. 【Matlab】求解积分方程的数值解