【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存/乐观悲观锁等优化算法)...
1. 循环分页或者循环进行部分读取处理数据的时候,使用 session.clear() ;
2. 对应1+N(N+1)问题使用如下解决方式:
1): 使用createCriteria进行查询(join fetch)
2):HQL -> join fetch
3): 使用@fetch设置LAZY
4):在@Entity下使用注解@BatchSize(size=5)
@BatchSize 指定每次 读 取数据的数量
3. List 与 iterate 进行遍历取出数据库数据的list();
区别1)List 直接取出对象 iterate先会取出组件,需要使用才会使用
区别2)同一个session中每次执行list()取出数据时都会发送SQL语句,但是iterate只会发出一条,默认会去session缓存去找;
4. 缓存,session级别的缓存称为一级缓存,每个session都有独立的一级缓存,例如多个线程同时取同一个对象数据;
解决方案:建立一个共用的总缓存(总缓存)二级缓存,如果找不到然后再到各自的session一级混村中寻找;具体操作如下:首先看缓存策略,
type : 其中memory支持缓存内存中,disk支持缓存存放硬盘中;
Cluster Safe :是否支持使用在集群环境;
Query Cache Supported:是否支持查询缓存(3级缓存)
假设使用EhCacheProvider二级缓存:
1)修改hibernate.cfg.xml配置文件:
1
2
|
< property name = "cache.use_second_level_cache" >true</ property >
< property name = "cache.provider_class" >org.hibernate.cache.EhCacheProvider</ property >
|
2) 在/hibernate-distribution-3.3.2.GA/project/etc/ehcache.xml 配置文件拷贝到项目中;
在ehcache.xml中默认如下设置:
1
|
< diskStore path = "java.io.tmpdir" />
|
1
2
3
4
5
6
7
|
< defaultCache
maxElementsInMemory = "10000"
eternal = "false"
timeToIdleSeconds = "120"
timeToLiveSeconds = "1200"
overflowToDisk = "true"
/>
|
maxElementsInMemory:在内存中最多缓存的对象数量
eternal: 缓存内存对象是否永久保存不删除
timeToIdleSeconds: 当timeToIdleSeconds 周期时间没有被使用过,自动清除掉;(秒)
timeToLiveSeconds: 缓存对象的生存时间(秒)后自动清楚;
overflowToDisk:溢出的时候是否放置在硬盘上
diskStore path:默认临时存放硬盘缓存的路径
注意:<cache name="sampleCache1" /> 可以自定义cache名,不自定义不指定默认是用 <defauleCache ..... />
3)将类使用二级缓存,直接在@Entity下使用注解 @Cache 其设置如下:
常用的READ_ONLY (只读), READ_WRITE(读写)
其中@Cache(region="") 使用自定义ehcache.xml的自定义缓存策略设置 ~
4)加入ehcache的jar包,路径如下:/hibernate-distribution-3.3.2.GA/lib/optional/ehcache/ehcache.jar
加入 commons-logging.jar包
1. 放入二级缓存如下规则:
a) 经常访问 b) 不经常改动(改动不大) c) 数据不是很大 例如用户权限;
2. load 默认使用二级缓存,iterate 默认使用二级缓存
3. list 默认往二级缓存加数据,list查询的使用不使用缓存
4. 如果要 query 查询语句使用二级缓存,需要打开查询缓存(同样的重复的查询!)
1) hibernate.cfg.xml配置文件加入配置:
<property name="cache.use_query_cache">true</property>
2) 使用Query的setCachable(true) 方法指明使用二级缓存 ;
5. 缓存算法:LRU 、 LFU 、 FIFO
LRU: 最近最少被使用的; (时间)
LFU: 使用率比较少的;(次数)
FIFO:按照数据从0开始拿走(堆栈)
设置方法:在ehcache.xml继续设置一个参数: memoryStoreEvictionPolicy="LRU"
6. 事务隔离机制(为了避免事务并发出现的问题)
1. read-uncommitted : 能读取没有提交的数据; 【会出现脏读等问题,一般不设置此种】
2. read-committed : 只有提交后才读;Hibernate建议使用!【能解决脏读但会出现不可重复读和幻读问题(手动解决)】
3. repeatable read : 加锁;(MySQL默认使用 repeatable read )
4. serializable : 序列化,解决任何问题,但是效率最低;
MySQL 支持这四种事务隔离机制; 事务隔离级别越高效率越慢~
使用 select @@tx_isolation; 查询事务隔离机制;
设置隔离机制: set session tx_isolation='xxx';
Hibernate解决并发事务方案:使用Hibernate悲观锁和乐观锁进行设置;
1)事务机制的值为1,2,4,8 (ps. 二进制为0001 ,0010,0100,1000 这样算法效率高)
1.a)使用悲观锁:(依赖于数据库的锁 解决 repeatable read问题)
在读取load数据的时候,加入第三个参数::
session.load(xxx.class, 1,LockMode.xxx);
LockMode的值如下:
一般只设置LockMode.UPGRADE
原因:
NONE: 无锁的机制,Transaction结束时切换到此模式;
READ :在查询的时候 hibernate会自动获取锁;
write ,insert, update hibernate 会自动获取锁;
以上 3种锁的模式是hibernate内部使用的;
UPGRADE—NOWAIT ->是oracle数据库 支持的锁;
1.b)使用乐观锁:(程序内使用字段version进行加锁,与数据库没有关系)
可以定义一个version属性,然后在getVersion上使用注解 @Version
注意:当并发的时候会报错,那么找个错误交给我们自己来处理;
悲观与乐观:悲观一开始就进行加锁,不论是否有其他事务来同时并发;但是乐观锁则不进行直接加锁,而是等待更新时候进行检查对比下,如果与去之前version不一致那么更新下即可;乐观锁效率高;
【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存/乐观悲观锁等优化算法)...相关推荐
- 【HIBERNATE框架开发之九】HIBERNATE 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)...
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/825.html 1. ...
- 【Hibernate框架开发之五】Hibernate对象的三种状态Session常用方法
1. Hibernate对象的三种状态:(图解如下:) 如图所示,Hibernate对象有三种状态,1.Transient 2.Persistent 3.Detached; 三种状态的区别如下: 1 ...
- Hibernate二级/查询缓存的陷阱
这篇文章将介绍如何设置Hibernate二级和查询缓存,它们如何工作以及最常见的陷阱. 休眠二级缓存是用于存储实体数据的应用程序级缓存. 查询缓存是一个单独的缓存,仅存储查询结果. 这两个缓存实际上是 ...
- 数据库工作笔记017---还记得Oracle悲观锁和乐观锁嘛?以及hibernate对乐观悲观锁的封装
技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 今天又用到这个了,之前做分布式,很多表在设计的时候都不加各种限制以及关联了,因为加了以后,数据库以后维护,成本很大 但是 ...
- MySQL调优(二):数据类型和schema优化,MySQL8.0取消查询缓存的原因
数据类型和schema优化 数据类型的优化 合理使用范式和反范式 三大范式: 1.表不可分 2.不能存在传递依赖 3.表里其他列的值必须唯一依赖于主键 约定大于规范,没有必要严格遵守范式,以业务为准, ...
- 霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理
举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种"指南"和"圣经"难以枚举,不一而足,仿佛SQL优化已然是妇孺皆知的理论常识, ...
- Hibernate(一)——采用Hibernate框架开发环境搭建
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员充分使用对象编程思维来操作数据库.HIbernate的移植性很好,它可以应用于任何JDB ...
- python映射实体类_【HIBERNATE框架开发之二】第一个HIBERNATE-ANNONATION项目(采用@ENTITY、@ID直接映射实体类)...
紧接上一篇,这里Himi直接copy上一篇创建的HelloHibernate项目,然后改名为:HelloAnnonation,Ok: OK,准备工作: 首先第一步,继续再我们自定义的user libr ...
- (详细)Hibernate框架的搭建,Hibernate的CRUD操作(一)
一.框架概述: 框架的优点:开发速度快,规范 后台框架:Hibernate,MyBATIS(iBATIS),EJB 前台框架(MVC):Struts(1/2),SpringMVC,JSF Spring ...
最新文章
- 如何初始化一个定长ListT
- 发展医疗大数据 需捅破各层窗户纸
- SpringBoot中yml文件报错:org.yaml.snakeyaml.scanner.ScannerException:mapping values are not allowe here...
- c盘扩展卷功能只能向右扩展_信用风险管理:功能扩展和选择
- HTTPS 路径配置
- svg转css font,css – 如何将.svg文件转换为字体?
- jquery-事件委托-delegate
- asp.net 添加权限
- 大道至简 爱上Metro
- 简单的制作一个动态链接库(DLL)
- [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机hash)
- android studio httpclient包导入,HttpClient不会导入Android Studio
- atomikos 配置好后 @transactional 注解不生效的问题
- 如何将flv格式的视频转换为mp4格式
- 小程序从数组中删除指定对象,返回新的长度源代码
- 汽车手机互联一键启动手机撑控
- 如何提升广告ROI?转化跟踪了解一下
- hypermill后处理构造器安装_康明斯发动机尾气后处理系统常见故障及维修
- biomarker研究思路
- 安装snmptraped 和 snmptt
热门文章
- js关闭iframe窗口_[Selenium]24.处理弹窗新式的模态窗口
- android 联系人批量插入,GitHub - Atinerlengs/InsertDemo: android 简单的批量插入通话记录、联系人、短信demo...
- MySQL -通过调整索引提升查询效率
- Python(25)-单例设计模式
- 剑指offer(刷题41-50)--c++,Python版本
- Java web后端5 JSP技术
- 计算机系统基础 计算机系统的基本组成与基本功能
- 如何成为一个技术“牛人”
- 揭秘IT人才特点:中美印日四国程序员比较
- 解决dataTable 报错:cannot read property “style“ of undefined