首页 > 编程语言 >【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)

【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)

时间:2022-11-24 14:35:34浏览次数:69  
标签:ehcache 缓存 二级缓存 session Hibernate hibernate 使用 优化




本站文章均为​ 李华明Himi ​​原创,转载务必在明显处注明:​​​​


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配置文件:


​<​​ ​​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中默认如下设置:


​<​​ ​​diskStore​​ ​​path​​ ​​=​​ ​​"java.io.tmpdir"​​ ​​/>​



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



标签:ehcache,缓存,二级缓存,session,Hibernate,hibernate,使用,优化
From: https://blog.51cto.com/xiaominghimi/5883901

相关文章

  • 缓存
    知识点:【缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。......
  • Hibernate3.X实现基于CLOB字段类型的注解方式:
    一:Hibernate3.X实现基于CLOB字段类型的注解方式的例子:下面直接上代码:二:UserInfo.javapackagecn.gov.csrc.cms.model;importjavax.persistence.Basic;importjavax.persist......
  • 检测内存泄漏、优化的常用手法[笔记]
    可视化自动内存泄漏检测//debugImplementation'com.squareup.leakcanary:leakcanary-android:2.3'///屏蔽提升操作速度,开启后不需要任何代码的。原理是内容提供者开......
  • 重新认识下JVM级别的本地缓存框架Guava Cache(2)——深入解读其容量限制与数据淘汰策
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。通......
  • 微信公众号H5或者H5内嵌安卓webview——调试工具和缓存问题
    1、vConsole的使用在此类开发中,最麻烦的是上测试环境调试;这边使用的是vconsole;方法:在index.html中cdn引入vconsole后初始化即可2、缓存问题遇到的问题:在公众号H5中每......
  • [每日分享]android获取文件目录总大小实现清除缓存
    跟大家讲一个笑话,我维护老项目,看到有一个清除缓存功能,我看了一下怎么实现的,结果就一个​​Toast​​太逗比了/***获取指定文件夹的大小**@paramf......
  • 【Hibernate框架开发之八】Hibernate 查询语言Query Language(HQL)
    本站文章均为​​ 李华明Himi ​​​原创,​​​​​  生成一条HQL查询语句 Query, 使用Session的createQuery(“hql语句”)生成QueryHQL语句:1.“fromclassName......
  • ASP .NET Core 缓存
    缓存可以通过减少生成内容所需的工作,显著提高应用的性能和可伸缩性。缓存最适用于不常更改且生成成本很高的数据。缓存生成的数据副本可以比从源中更快地返回。应该以从......
  • redis 缓存设计之穿透击穿雪崩
    缓存穿透缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常处于容错的考虑,如果从存储层查不到数据则不写入缓冲层缓存穿透将导致不存在的数据每次请求......
  • 决策单调性优化dp二则
    CielandGondolas  CodeForces-321E题意:有n个人,第i个人和第j个人放在一起时会产生a[i][j]的沮丧值(是社恐吗),保证a[i][j]=a[j][i],两个人只产生一份沮丧值。将n个人分成......