hibernate缓存和提高效率
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缓存和提高效率的更多相关文章
- java之hibernate之hibernate缓存
这篇主要讲 hibernate缓存 1.缓存的作用是为了提高效率 2.Hibernate的开发效率比较高,但是执行效率相对较低. 3.Hibernate提供了缓存来提高效率.hibernate缓存分为 ...
- Hibernate缓存原理与策略
Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...
- 菜鸟学习Hibernate——缓存
Hibernate的缓存分为三种:一级缓存.二级缓存.查询缓存.下面我就为大家介绍一下. 一.概念. 一级缓存:第一级存放于session中称为一级缓存.Session 级别的缓存,它同session ...
- hibernate缓存技术
1.缓存 2.Hibernate 缓存作用:为了提高查询效率. 3.第一次操作某个对象的时候,把操作的对象数据存储到缓存中,然后下一次在对同一个对象操作的时候,就不会在连接数据库. 4.Hiberna ...
- Hibernate学习笔记二:Hibernate缓存策略详解
一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...
- Hibernate缓存应用的积累与总结
Hibernate缓存一直比较难掌握,下面就分析和总结原因,相信你就会慢慢清楚了原来Hibernate缓存也是可以轻松掌握的,但前提要求大家必须跟着动手去验证一下,再用心体会,光看是没有用的 目录: ...
- Hibernate缓存研究
1. 什么是缓存? 数据库的缓存指的是应用程序和物理数据源之间的数据.即把物理数据源的数据复制到缓存.有了缓存,可以降低应用程序对物理数据源的访问频率,从而提高效率.缓存的介质一般是内存,也可以是硬盘 ...
- 实体类的状态与Hibernate缓存
一.Hibernate中实体类的三种状态 1.瞬时态 该状态下实体类对象的id属性没有值,该对象和session也没有关系. 实例: UserEntity user = new UserEntity( ...
- Hibernate缓存策略
Hibernate的一级缓存又称为Session缓存,其适用范围是在当前的会话之中,其生命周期和Session相同,随着Session的销毁,一级缓存也会随之销毁.一级缓存是不能取消的,Hiberna ...
随机推荐
- ulua slua 下载地址
ulua http://www.yanyulin.info/pages/2015/01/27193946190814.html http://www.manew.com/blog-27966-25 ...
- Hive中JOIN操作
1. 只支持相等JOIN. 2. 多表连接当使用不同的列进行JOIN时,会产生多个MR作业. 3. 最后的表的数据是从流中读取,而前面的会在内存中缓存,因此最好把最大的表放在最后. SELECT /* ...
- Java Swing事件处理机制
Java Swing的事件处理机制 Swing GUI启动后,Java虚拟机就启动三个线程,分别为主线程,事件派发线程(也是事件处理线程)和系统工具包线程. 主线程 :负责创建并显示该程序的初始界面: ...
- jsonp跨域原理
Jsonp原理: 首先在客户端注册一个callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)传给服务器.注意:服务端得到ca ...
- FileReader本地预览图片
<body> <p><label>请选择一个图像文件:</label><input type="file" id=" ...
- 20145218 《Java程序设计》第9周学习总结
20145218 <Java程序设计>第9周学习总结 教材学习内容总结 16.1.1 JDBC简介 JDBC全名Java DataBase Connectivity,是java联机数据库的 ...
- swiper轮播图--兼容IE8
//引入idangerous.swiper.min.js var mySwiper = new Swiper ('.swiper-container', { loop: true, paginatio ...
- XX宝面试题——css部分
1.<b></b>与<strong></strong>有什么不同? 1) <b>标签是一个实体标签,它所包围的字符将被设为bold(粗体), ...
- 登陆验证前对用户名和密码加密之后传输数据---base64加密
以下这种方法是加密传输的简单实现 1,base64.js /** * * Base64 encode / decode * * */ function Base64() { // private pr ...
- BZOJ1576 [Usaco2009 Jan]安全路经Travel
首先用Dijkstra做出最短路生成树,设dis[p]为1到p点的最短路长度 对于一条不在生成树上的边u -> v,不妨设fa为u.v的lca 则一fa到v的路径上的任意点x都可以由u达到,走的 ...