视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001 知道1 知道21 知道41 知道61 知道81 知道101 知道121 知道141 知道161 知道181 知道201 知道221 知道241 知道261 知道281
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
Hibernate性能优化
2020-11-09 16:28:21 责编:小采
文档

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/8/8-141.html (1)大量分页查询时,及时session.clear(),可能导致内存溢出; 大集合遍历:如寻找敏感词汇; 注:内存泄漏,Java本身不会内存泄漏,但是Java调用的底层C会内存泄

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/8/8-141.html

(1)大量分页查询时,及时session.clear(),可能导致内存溢出;
大集合遍历:如寻找敏感词汇;
注:内存泄漏,Java本身不会内存泄漏,但是Java调用的底层C会内存泄漏。
(2)1+N问题:(典型面试题)
一个实体A关联着另一个实体B,查询所有的实体A时,原本一条sql语句就可完成,结果后面却多了N条查询各个A关联的实体B的查询语句的问题,影响性能。
解决办法:A. 实体B设置为LAZY;
B.BatchSize多次单条查询合并成少次的多条查询,减少sql次数;
C.join fetch:设置外连接,把后面要查询的也一起查出来,减少查询次数。
(3)BatchSize多次单条查询合并成少次的多条查询,减少sql次数。
(4)List的Iterator:
A.List:Query查询到的List是直接一条sql查询所有结果;
B.Iterator:只查询表的最小主键,接下来每访问一条才发送一条sql语句查询具体的记录,但是Iterator使用了Hibernate的缓存,同一个session查询两次,底层sql只发送一次而已,它会自己去缓存中查询结果是否已经有了,减少sql查询次数。
(5)一级缓存、二级缓存、查询缓存(面试题)
A.一级缓存:session中的缓存,查询过一次之后的同一个session下再次查询会从缓存中查询;
B.二级缓存:SessionFactory级别的缓存,可以跨越session,Hibernate没有实现,需要使用第三方二级缓存实现,默认EHCache,需要EHCache和Logging的jar;
a.打开二级缓存:Hibernate主配置文件设置打开缓存并指定二级缓存实现类;
@Cache注解:标注需要缓存到二级缓存的实体Entity;
Ehcache.xml:EHCache二级缓存的配置文件,可设置多个缓存配置,根据
name选择设置的属性配置;
b.适用二级缓存:经常访问、改动不大、数量有限;
c.load、iterator默认使用二级缓存,list有往二级缓存加数据但是查询时不使用;
d.query若要使用二级缓存,需要打开查询缓存,
true
setCachable(true);指明Query打开二级缓存;
e.缓存算法:LRU最近最少使用、FIFO(先进先出)、LFU(最近最不常使用)
C.查询缓存:特殊的二级缓存,专门用于查询操作;
(6)二级缓存使用步骤:
A.导入ehcache的jar和commons-logging的jar;
B.类路径加入ehcache的配置文件,里面配置缓存配置;
C.hibernate的全局配置文件配置开启二级缓存;
D.标签设置要开启二级缓存的实体类;
E.:usage设置缓存策略,region设置要使用的EHCache配置选项,include设置是否缓存该实体所关联的关联实体。
(7)事务并发处理(面试):
事务基础知识见JDBC笔记;
A. 悲观锁:解决不可重复读,load添加第三个参数设置;
悲观地认为别人总想着影响自己,直接加锁,防止别人的影响;
B. 乐观锁:解决多人同时修改,程序中实现;
乐观地认为别人不会来影响自己,加一个记录版本号的属性,@Version,事务开始时检查版本号,到真正要修改时再检查版本号,若版本号不变,则正确执行,版本号变了说明被影响了,报错;
(8)一定要设置连接池!!!
(9)一定注意数据库的全表查询是禁止的,关联关系的多方直接不延迟也是禁止的,Hibernate会把整个表加入内存和一级缓存,很容易导致内存溢出。

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/8/8-141.html

下载本文
显示全文
专题