【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不一致那么更新下即可;乐观锁效率高;





本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/969788,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新ffmpeg编译和用eclipse进行源码调试

最近由于项目需要&#xff0c;必须修改ffmpeg的源码进行修改才能满足项目的需求&#xff0c;但以前我从来没有自己去编译和使用ffmpeg的源代码&#xff0c;一直都是用别人编译好了的sdk&#xff0c;再加上习惯了vs方便的编译环境&#xff0c;要在linux下对如此多的源代码进行编…

Django补充知识点——用户管理

内容概要 1、Form表单2、Ajax3、布局&#xff0c;Django母板4、序列化5、Ajax相关6、分页7、XSS攻击8、CSRF9、CBV、FBV 10、类中用装饰器的两种方法 11、上传文件 12、数据库正向查询、反向查询、多对多查询 13、jQuery对象和DOM对象可以互相转换 14、cookie和session 用户管理…

Python html 代码转成图片、PDF

一、下载 1、python的imgkit、pdfkit库 pip install imgkit pip install pdfkit 2、wkhtmltopdf工具包 下载地址&#xff1a;https://wkhtmltopdf.org/downloads.html 下载之后安装&#xff0c;安装完成会生成两个程序&#xff0c;分别用来转图片和pdf&#xff1a; 二、使…

SpringEL expression:

2019独角兽企业重金招聘Python工程师标准>>> 这个异常有下面几种情况 1、你写的 EL 表达式有语法错误。 2、再者就是你取得变量是多级的话比如 student.address.prevince 属性model 关联有问题。 3、还有就是你取得值为空&#xff08;null&#xff09; 比如 Thymel…

利用qt和ffmpeg软件来制作视频裁剪工具

0 什么是ffmpeg? Libav&#xff08;旧称&#xff1a;FFmpeg&#xff09;是一个自由软件&#xff0c;可以运行音频和视频多种格式的录影、转档、流功能[1]&#xff0c;包含了libavcodec ─这是一个用于多个专案中音频和视频的解码器库&#xff0c;以及 libavformat ——一个音频…

域添加另一台机器_巨杉Tech | SequoiaDB数据域概念解读与实践

近年来&#xff0c;银行各项业务发展迅猛&#xff0c;客户数目不断增加&#xff0c;后台服务系统压力也越来越大&#xff0c;系统的各项硬件资源也变得非常紧张。因此&#xff0c;在技术风险可控的基础上&#xff0c;希望引入大数据技术&#xff0c;利用大数据技术优化现有IT系…

推荐一个接口文档工具

ShowDoc 转载于:https://www.cnblogs.com/LW-baiyun/p/8003975.html

云计算的概念_云计算概念掀起涨停潮 美利云奠定板块龙头地位

温馨提示&#xff1a;股市风险时刻存在&#xff0c;文中所提个股仅为个人观点&#xff0c;请勿盲目跟随操作&#xff0c;笔者希望大家都做到不贪婪&#xff0c;不恐惧&#xff0c;不瞎猜&#xff0c;不跟风做一个纪律严明轻松淡定的股票交易者。社4月26日讯&#xff0c;沪深两市…

Python 第三方模块之 PDFMiner(pdf信息提取)

PDFMiner简介 pdf提取目前的解决方案大致只有pyPDF和PDFMiner。据说PDFMiner更适合文本的解析&#xff0c;首先说明的是解析PDF是非常蛋疼的事&#xff0c;即使是PDFMiner对于格式不工整的PDF解析效果也不怎么样&#xff0c;所以连PDFMiner的开发者都吐槽PDF is evil. 不过这些…

TFS2017持续发布中调用PowerShell启停远程应用程序

目前团队项目中有多个Web、服务以及与大数据平台对接接口等应用&#xff0c;每次的发布和部署采用手工的方式进行。停止应用程序&#xff0c;拷贝发布包&#xff0c;启动应用程序&#xff0c;不停的循环着&#xff0c;并且时不时地会出现一些人为错误性问题。这种模式消耗的很多…

Flask 多线程

参数 app.run()中可以接受两个参数&#xff0c;分别是threaded和processes&#xff0c;用于开启线程支持和进程支持。 threaded&#xff1a; 是否开启多线程&#xff0c;默认不开启。 if __name__ __main__:app.run(threadedTrue)processes&#xff1a;进程数量&#xff0c…

基于LVS对LAMP做负载均衡集群

一、简介 LVS是Linux Virtual Server的简称&#xff0c;也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目&#xff0c;它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分&#xff0c;在Linux2.4内核以前&#xff0c;使用LVS时必须要…

Python_Day1

1、猜年龄游戏&#xff1a; &#xff08;1&#xff09;&#xff1a;每循环3次&#xff0c;counter值返回为0&#xff0c;重新开始循环&#xff1b;&#xff08;2&#xff09;&#xff1a;continue 意思是跳出当前循环&#xff1b;&#xff08;3&#xff09;&#xff1…

kafka 入门

初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的&#xff0c;它是一个分布式的&#xff0c;支持多分区、多副本&#xff0c;基于 Zookeeper 的分布式消息流平台&#xff0c;它同时也是一款开源的 基于发布订阅模式的消息引擎系统。 Kafka 的基本术语 消息&#xf…

实体词典 情感词典_tidytextpy包 | 对三体进行情感分析

腾讯课堂 | Python网络爬虫与文本分析TidyTextPy前天我分享了 tidytext | 耳目一新的R-style文本分析库 但是tidytext不够完善&#xff0c;我在tidytext基础上增加了情感词典&#xff0c;可以进行情感计算&#xff0c;为了区别前者&#xff0c;将其命名为tidytextpy。大家有时间…

Python基础第一天

一、内容 二、练习 练习1 题目&#xff1a;使用while循环输出1 2 3 4 5 6 8 9 10 方法一&#xff1a; 图示&#xff1a; 代码&#xff1a; count 1 while count < 11:if count ! 7:print(count)count 1输出结果&#xff1a; 1 2 3 4 5 6 8 9 10 View Code方法二&#xff1…

vaOJ10369 - Arctic Network

1 /*2 The first line of each test case contains 1 < S < 100, the number of satellite channels!3 注意&#xff1a;S表示一共有多少个卫星&#xff0c;那么就是有 最多有S-1个通道&#xff01; 然后将最小生成树中的后边的 S-1通道去掉就行了&#xff01; 4…

在ffmpeg中加入x264模块

引言&#xff1a;最近一直致力于多媒体应用开发&#xff0c;一说起编码解码就不得不说下FFmpeg。FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的开发是基于Linux操作系统&#xff0c;但是可以在大多数操作系统中编译和使用。下面就详细介…

RabbitMQ实例教程:发布/订阅者消息队列

消息交换机&#xff08;Exchange&#xff09; RabbitMQ消息模型的核心理念是生产者永远不会直接发送任何消息给队列&#xff0c;一般的情况生产者甚至不知道消息应该发送到哪些队列。 相反的&#xff0c;生产者只能发送消息给交换机&#xff08;Exchange&#xff09;。交换机的…

OAuth 2.0(网转)

&#xff08;一&#xff09;背景知识 OAuth 2.0很可能是下一代的“用户验证和授权”标准&#xff0c;目前在国内还没有很靠谱的技术资料。为了弘扬“开放精神”&#xff0c;让业内的人更容易理解“开放平台”相关技术&#xff0c;进而长远地促进国内开放平台领域的发展&#xf…