【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,如需转载请自行联系原作者
目录
相关文章
|
3天前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
2天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
|
3天前
|
算法 数据安全/隐私保护
基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真
本程序基于二次规划优化的OFDM系统PAPR抑制算法,旨在降低OFDM信号的高峰均功率比(PAPR),以减少射频放大器的非线性失真并提高电源效率。通过MATLAB2022A仿真验证,核心算法通过对原始OFDM信号进行预编码,最小化最大瞬时功率,同时约束信号重构误差,确保数据完整性。完整程序运行后无水印,展示优化后的PAPR性能提升效果。
|
6天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-LSTM-SAM网络时间序列预测算法。使用Matlab2022a开发,完整代码含中文注释及操作视频。算法结合卷积层提取局部特征、LSTM处理长期依赖、自注意力机制捕捉全局特征,通过粒子群优化提升预测精度。适用于金融市场、气象预报等领域,提供高效准确的预测结果。
|
2月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
156 68
|
20天前
|
算法
基于遗传优化算法的风力机位置布局matlab仿真
本项目基于遗传优化算法(GA)进行风力机位置布局的MATLAB仿真,旨在最大化风场发电效率。使用MATLAB2022A版本运行,核心代码通过迭代选择、交叉、变异等操作优化风力机布局。输出包括优化收敛曲线和最佳布局图。遗传算法模拟生物进化机制,通过初始化、选择、交叉、变异和精英保留等步骤,在复杂约束条件下找到最优布局方案,提升风场整体能源产出效率。
|
26天前
|
机器学习/深度学习 存储 算法
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
近端策略优化(PPO)是深度强化学习中高效的策略优化方法,广泛应用于大语言模型的RLHF训练。PPO通过引入策略更新约束机制,平衡了更新幅度,提升了训练稳定性。其核心思想是在优势演员-评论家方法的基础上,采用裁剪和非裁剪项组成的替代目标函数,限制策略比率在[1-ϵ, 1+ϵ]区间内,防止过大的策略更新。本文详细探讨了PPO的基本原理、损失函数设计及PyTorch实现流程,提供了完整的代码示例。
228 10
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
|
11天前
|
数据采集 人工智能 编解码
算法系统协同优化,vivo与港中文推出BlueLM-V-3B,手机秒变多模态AI专家
BlueLM-V-3B是由vivo与香港中文大学共同研发的多模态大型语言模型,专为移动设备优化。它通过算法和系统协同优化,实现了高效部署和快速生成速度(24.4 token/s),并在OpenCompass基准测试中取得优异成绩(66.1分)。模型小巧,语言部分含27亿参数,视觉编码器含4000万参数,适合移动设备使用。尽管如此,低端设备可能仍面临资源压力,实际应用效果需进一步验证。论文链接:https://arxiv.org/abs/2411.10640。
31 9
|
20天前
|
机器学习/深度学习 数据采集 算法
基于WOA鲸鱼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB 2022a实现时间序列预测,采用CNN-GRU-SAM网络结构,结合鲸鱼优化算法(WOA)优化网络参数。核心代码含操作视频,运行效果无水印。算法通过卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征,全连接层整合输出。数据预处理后,使用WOA迭代优化,最终输出最优预测结果。
|
23天前
|
算法
基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
本程序基于海鸥优化算法(SOA)进行三维曲面最高点搜索的MATLAB仿真,输出收敛曲线和搜索结果。使用MATLAB2022A版本运行,核心代码实现种群初始化、适应度计算、交叉变异等操作。SOA模拟海鸥觅食行为,通过搜索飞行、跟随飞行和掠食飞行三种策略高效探索解空间,找到全局最优解。