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 ...
随机推荐
- java 多线程4(死锁)
死锁现象: 死锁原因: 1.存在两个或两个以上的线程. 2.存在两个或两个或两个以上的共享资源. 死锁现象解决的方案: 没有方案只能尽量避免.
- 如何组织较大项目的MVC文件夹结构
现在还用不到,拷贝下来备用,原文链接 2016 年 9 月 第 31 卷,第 9 期 ASP.NET Core - ASP.NET Core MVC 的功能切分 作者 Steve Smith | 20 ...
- MHA的几种死法-叶良辰
master不通 找到最新slave 找到有所有其他slave缺失relay log的 slave 选主 配置文件指定 ...
- 国内外做MySQL的公司
MariaDB 基金会 Percona企业级服务 vividx 监控 webyog 监控和管理 springboksql mysql 一体机 htt ...
- 使用PowerShell简化我的工作
欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...
- JSONObject和JSONArray使用
1.所依赖JAR包 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jar commons-beanutils.jar common ...
- HTML5自定义属性对象Dataset简介
一.html5 自定义属性介绍 我之前翻译的“你必须知道的28个HTML5特征.窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设 ...
- PHP Warning: ob_start() : output handler 'ob_gzhandler conflicts with 'zlib output compression'
安装phpcms过程中,会遇到Warning: ob_start() : output handler 'ob_gzhandler conflicts with 'zlib output compr ...
- S2 第二章数据库的实现
实现增删改查代码 1 select * from student --增加数据 insert into student (name,banji,xuehao) values(,) --修改数据 upd ...
- asp.net 奇淫技巧
VS2013自动注释插件 分享一个Visual Studio的背景插件,让堆码更富情趣 工欲善其事必先利其器系列之:更换Visual Studio代码风格. 为Visual Studio更换皮肤和背景 ...