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. Django中如何配置Database缓存?

    BACKEND: django.core.cache.backends.db.DatabaseCache LOCATION: 数据库表名 示例: CACHES = { 'default': { 'BA ...

  2. phpstorm xdebug 碰到很神奇的一件事

    早上配置好了,且正常运行了,然后没有退出phpstorm, 结果到了下午,配置消失了, 还好稳住了阵脚,然后配置了,就好了. 很重要一点,在调试观看源代码的时候,一定要浅薄,然后深入,不然累死,得不偿 ...

  3. NumPy(Numeric Python)使用方法

    NumPy官网 参考:<Python数据分析基础教程:NumPy学习指南> 用Python做科学计算(好东西) NumPy是python的核心库,是python机器学习编程的最底层的库,不 ...

  4. VB6 GDI+ 入门教程[1] GDI+介绍

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[1] GDI+介绍 2009 年 6 月 18 日 17 ...

  5. 项目解析- JspLibrary - part3

    CRUD read: String sql = "select b.*,c.name as bookcaseName,p.pubname as publishing,t.typename f ...

  6. java 字符串(正则表达式)未完

    正则表达式: 其实就是用于操作字符串的一个规则.(以某种方式描述字符串) 基础: 1.描述一个整数:\d(表示一位数字) \\d(\\ 表示要插入一个正则表达式)表示一位数字 \\\\  插入一个普通 ...

  7. IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常

    标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...

  8. spring来了-03-bean创建细节

    对象创建:单例/多例  [bean节点的属性scope] scope="singleton", 默认值,即默认是单例     [service/dao/工具类] scope=&qu ...

  9. [Nginx] 关键概念解读

        1.正向代理服务器VS反向代理服务器 我们知道,万维网的相互访问必须是外部网络间的相互访问,也就是访问的必须是外网IP或者映射为外网IP的域名.诸如192.168.1.11这样的内网IP是无法 ...

  10. DataOdinalRegression

    clear name={'SCV1V1','SVC1VA','SVR','CSSVC','SVMOP','NNOP','ELMOP','GPOR','KDLOR','POM',... 'NNPOM', ...