1.使用二级缓存,多把大批量的、短期多次的查询数据存到二级缓存中,避免和数据库的多次交互,增加负担。二级缓存加在那些增删改少的,查询多的类中。二级缓存的是对象,如果查出来的不是对象,不会放到缓存中去。如果用createquery.iterator,得到一个iterator对象,那么和load的道理差不多,用一条语句,把所有的对象的id取出,形成代理对象。使用的时候会一条一条的去数据库取, 这就是N+1问题。但是之所以存在iterator,是因为如果list查出来之后,放到一级缓存(session关闭就没了),更多的是放到二级缓存中的时候(session关闭还有),在用iterator,就会只查对象的id,然后根据id在缓存中提取对象,达到优化的目的。list之后在list还是取对象而不是取id。二级缓存比一级缓存持续时间长,所以iterator的意义更大一些,多次request请求甚至不是同一个地址的也可以使用。在hibernate中,iterator 和load非常相似,不过区别是,load方法的参数中是有id的,那么第一次创建代理对象的时候就直接创建不需要和数据库交互,而iterator方法中没有这个id,要从数据库根据查询语句取出来所有的id(创建代理对象?),等以后要用的时候再根据id,去数据库取,然而此时如果前面用list已经取过这些id对应的对象,放在一级或者二级缓存中了,那么就直接去缓存中取就可以了。

2.特大项目对象数据较少的,可以不用单独建表,可以考虑在需要的关联表上添加冗余数据,但是修改较麻烦。比如学生,班级,专业,可以班级和专业不单独建表,在学生的属性中增加班级名称和编号,专业名称和编号,作为冗余字段,如果想获得专业和班级对象,可以做一个dto,包含学生,班级,专业对象,将数据传输进。通过sql语句而不是hql语句查询,可以不用一级缓存,对内存占用量比较小,特定情况可以考虑。比如查看所有用户的操作,就没必要放入二级缓存中,因为这个是只有管理员偶尔才进行的操作,一级缓存中足够;当很多不同的地址或用户访问,都需要获取的数据,放到二级缓存中是最好的。hibernate在用hql语句的时候会自动转化成sql语句,然后得到的结果再自动封装成对象。如果不想用缓存,直接用sql语句,需要对得到的结果进行封装。如果对于@entity的对象,可以直接使用addentity()方法,对于没有被@entity管理的对象,比如dto对象,可以用setresulttransformer( )方法进行转换,得到dto对象。简单说就是你想封装成entity管理的对象,就直接addentity。如果想封装成自己新建的对象,就前面select出来的列名as一个和dto中属性相同的名称,然后用setresulttransformer( )方法进行封装。

3.由于二级缓存存的是对象,可以在对象类的配置中设置readonly,这样可以保证缓存中的数据在一定时期不会变化,但是有时候涉及脏数据问题。

4.你写了@manytoone,就意思是要把注解的属性的类和自己的类进行关联,自己的被注解的属性是1,自己的类是多,自己的属性在数据库里是外键,关联的是对方(1)的主键。而同时在一的类里面,多的set<> 一组属性写了@onetomany,

hibernate缓存和提高效率的更多相关文章

  1. java之hibernate之hibernate缓存

    这篇主要讲 hibernate缓存 1.缓存的作用是为了提高效率 2.Hibernate的开发效率比较高,但是执行效率相对较低. 3.Hibernate提供了缓存来提高效率.hibernate缓存分为 ...

  2. Hibernate缓存原理与策略

    Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...

  3. 菜鸟学习Hibernate——缓存

    Hibernate的缓存分为三种:一级缓存.二级缓存.查询缓存.下面我就为大家介绍一下. 一.概念. 一级缓存:第一级存放于session中称为一级缓存.Session 级别的缓存,它同session ...

  4. hibernate缓存技术

    1.缓存 2.Hibernate 缓存作用:为了提高查询效率. 3.第一次操作某个对象的时候,把操作的对象数据存储到缓存中,然后下一次在对同一个对象操作的时候,就不会在连接数据库. 4.Hiberna ...

  5. Hibernate学习笔记二:Hibernate缓存策略详解

    一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...

  6. Hibernate缓存应用的积累与总结

    Hibernate缓存一直比较难掌握,下面就分析和总结原因,相信你就会慢慢清楚了原来Hibernate缓存也是可以轻松掌握的,但前提要求大家必须跟着动手去验证一下,再用心体会,光看是没有用的 目录: ...

  7. Hibernate缓存研究

    1. 什么是缓存? 数据库的缓存指的是应用程序和物理数据源之间的数据.即把物理数据源的数据复制到缓存.有了缓存,可以降低应用程序对物理数据源的访问频率,从而提高效率.缓存的介质一般是内存,也可以是硬盘 ...

  8. 实体类的状态与Hibernate缓存

    一.Hibernate中实体类的三种状态 1.瞬时态 该状态下实体类对象的id属性没有值,该对象和session也没有关系. 实例: UserEntity user = new UserEntity( ...

  9. Hibernate缓存策略

    Hibernate的一级缓存又称为Session缓存,其适用范围是在当前的会话之中,其生命周期和Session相同,随着Session的销毁,一级缓存也会随之销毁.一级缓存是不能取消的,Hiberna ...

随机推荐

  1. JQuery & Javascript

    Jquery 是一个优秀的javascript框架,是轻量级的js库 jQuery简化了javascript 编程 jQuery很容易学习

  2. node下新建工程

    打开控制台 输入express --view ejs 成功后有 输入cnpm install 成功后有 查看下现在的json文件,如图 用数据库的话可以键入 cnpm install --save m ...

  3. 向html中添加节点

    简单: ①,js中: (function () { var box=document.querySelector("#box"); var con1=document.create ...

  4. 学习HTML5之塔克大战(详细记录)

    学了一些HTML5的一些基本知识,开始学习制作...... 介绍一些基本知识:  px(像素)--->1px等于多少? 1cm or 2cm -->no  no no! (1).像素是一个 ...

  5. SAP 预制发票时扣除已预制的数据

    INCLUDE程序: LMR1MF6S 最后增强: ENHANCEMENT ZMIR7_01. "active version DATA:LS_YDRSEG LIKE LINE OF YDR ...

  6. 使用window.navigator.userAgent属性判断浏览器类型及版本

    使用window.navigator.userAgent属性判断浏览器类型及版本 2011-12-11 22:03:11 window.navigator.userAgent属性包含了浏览器类型.版本 ...

  7. Your content must have a ListView whose id attribute is 'android.R.id.list'

    修改ListView的ID为 ' @android:id/list ' <ListView android:id="@android:id/list" android:lay ...

  8. oracle常见权限分配

    1.GRANT 赋于权限 常用的系统权限集合有以下三个: CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理) 常用的数据对象权限有以下五个: ALL ON 数据对象名 ...

  9. qt 提高ui响应度

    如何使Qt 平台中的GUI保持响应流畅?一般来说耗时较长的操作,分为计算密集型操作和IO密集型操作,对于这两类操作如何提高响应速度. 而从操作的本质上来说,操作又可分为不可分解操作,如在第三方库中耗时 ...

  10. 如何在Hadoop的MapReduce程序中处理JSON文件

    简介: 最近在写MapReduce程序处理日志时,需要解析JSON配置文件,简化Java程序和处理逻辑.但是Hadoop本身似乎没有内置对JSON文件的解析功能,我们不得不求助于第三方JSON工具包. ...