性能优化(1+N,list与iterator,缓存,事务)

1、注意session.clear()的运用,尤其是不断分页循环的时候

A 在一个大集合中进行遍历,取出其中含有敏感字的对象

B 另一种形式的内存泄露.

2、1+N问题

问题描述:如@ManyToOne时,两个类分别是User与Group,取User时,本想发一条SQL语句,结果顺带发了N条语句,将每个User对应的Group也查询了。

解决方法有三种:

  (1)设为@ManyToOne(fetch=FetchType.LAZY)

  (2)在Group类中的@Entity下面加一条@BatchSize(size=5),则每一条SQL语句可以取出5个Group对象

  (3)查询语句写为“from User u left join fetch u.group g”

3、list和iterator的区别

  (1)list()返回List,直接取对象;list第二次发出,仍会到数据库中查询数据

  (2)iterator先取对象的主键,即ID,等到要用的时候再根据ID取出对象;iterator第二次首先查找session级缓存.

4、缓存

(1)一级缓存(session级别的缓存)

  例如,同一个session中,load两次,只向数据库发一条SQL语句。但如果是两个不同session中,分别load一次,则发两条SQL语句。

(2)二级缓存(SessionFactory级别的缓存,可以跨越session级别存在)

  两个不同session中,分别load一次,要想只发一条SQL语句,则需要利用二级缓存。

  load默认使用二级缓存,iterator默认使用二级缓存

  list默认向二级缓存添加数据,但是查询的时候不使用.

  如果Query需要使用二级缓存,则打开查询缓存。

  适用情况:经常被访问,改动不大,数量有限的情况,如用户权限,组织机构等。

  使用方法:Hibernate不提供二级缓存的实现,由其他厂商提供(如EH,OS,Swarm,JBoss)。使用时要配置xml,导入jar包。

       在相关类中需要@[email protected](usage = CacheConcurrencyStrategy.READ_WRITE)

(3)查询缓存:在二级缓存设置有效时才可以使用,需要在xml中设置。相同的查询语句才能使用查询缓存。 

  需要调用Query setCachable(true)方法指明使用二级缓存.

5、缓存算法

LRU,LFU, FIFO

Least Recently Used 按时间

Least Frequently Userd 按命中次数

First In First Out

memoryStoreEvictionPlicy=”LRU”(ehcache)

6、事务并发

(1)ACID 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

(2)事物并发带来的问题:

  • 脏读:读了其他未提交事务B的数据,该事务B后来被回滚了
  • 不可重复读:同一事务中,读了两遍,前后数据不一致。因为其他事务B更改了数据
  • 幻读:同一事务中,读了两遍,前后数据不一致。因为其他事务B插入/删除了数据

(3)数据库事务隔离级别:(javax.sql.Connection)

  • READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。
  • READ COMMITTED(Oracle默认):允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。
  • REPEATABLE_READ(MySQL默认):对相同字段的多次读取结果一致,可导致幻读。
  • SERIALIZABLE:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。

Dirty reads          non-repeatable reads            phantom reads 
Serializable                        不会                        不会                                  不会 
REPEATABLE READ             不会                        不会                                  会 
READ COMMITTED              不会                          会                                   会 
Read Uncommitted              会                            会                                    会

(4)一般选择READ COMMITTED,在此前提下,解决不可重复读问题(忽略幻读)有两种方式

  • 悲观锁:依赖于数据库。session.load(**.class,1,LockMode.UPGRADE);相当于select...from...where...for update
  • 乐观锁:与数据库无关,效率高。在类中加入private int version;属性@Version 该属性由Hibernate控制,没更新一次加1,不一致时报错。

性能优化(1+N,list与iterator,缓存,事务)

时间: 2024-10-05 16:43:51

性能优化(1+N,list与iterator,缓存,事务)的相关文章

Spark性能优化(2)——广播变量、本地缓存目录、RDD操作、数据倾斜

广播变量 背景 一般Task大小超过10K时(Spark官方建议是20K),需要考虑使用广播变量进行优化.大表小表Join,小表使用广播的方式,减少Join操作. 参考:Spark广播变量与累加器 Local Dir 背景 shuffle过程中,临时数据需要写入本地磁盘.本地磁盘的临时目录通过参数spark.local.dir配置. 性能优化点 spark.local.dir支持配置多个目录.配置spark.local.dir有多个目录,每个目录对应不同的磁盘,这样可以提升IO效率.另外,可以采

Linux性能优化实战:如何利用系统缓存优化程序的运行效率?(17)

一.缓存命中率 1.引子 1.我们想利用缓存来提升程序的运行效率,应该怎么评估这个效果呢? 用衡量缓存好坏的指标 2.有没有哪个指标可以衡量缓存使用的好坏呢? 缓存命中率 3.什么是缓存命中率? 所谓缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比.命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好 2.查看系统命中情况的工具 1.缓存在高并发系统的应用 实际上.缓存是现在所有高并发系统必须的核心模块,主要作用就是把经常访问的数据(也就是热点数据),提取读入

前端性能优化成神之路-浏览器缓存机制详解

对一个网站而言,CSS.javascript.logo.图标这些静态资源文件更新的频率都比较低,而这些文件又几乎是每次http请求都需要的,如果将这些文件缓存在浏览器中,可以极好的改善性能. 通过设置http头中的cache-control和expires的属性和HTML Meta标签,可设定浏览器缓存,缓存时间可以是数天,甚至是几个月. 浏览器缓存控制机制有两种:HTML Meta标签 vs. HTTP头信息(主要) HTML Meta 标签定义的缓存机制 可以在HTML页面的<head>节

网站性能优化你需知道的东西

本文提到的网站性能指网站的响应速度,这也符合绝大部分人对于网站性能的理解:访问快速的网站性能好,反之,访问速度越慢,则网站性能越差.本文总结的优化方法是宏观的工程层面的方法,并不包含微观的语言语法层面的方法,例如,JS.CSS的语法优化,这一部分同样影响网站的性能,但语言语法层面的优化更多的是取决于开发人员的编程水平. 什么样的网站响应速度快呢?其实很容易想到,网站加载资源的速度越快,网站响应速度越快:网站需要加载的资源越少,网站响应速度越快.这就分别对应网站性能优化的两大方向:资源缓存.资源合

WordPress 性能优化:为什么我的博客比你的快

WordPress 很慢? 很多博主都会感觉 WordPress 很慢?作为全世界最常用的建站和博客系统 WordPress 来说,在性能设计上肯定不会有太大的问题,WordPress 开发团队也肯定也考虑到这个问题. 那么 WordPress 效率问题主要是出在哪里呢?根据我多年 WordPress 建站和维护的经验,很多性能的问题都是 WordPress 使用不当造成的,比如安装太多效率低下的插件,使用代码质量低下的主题,没有正确处理 WordPress 的缓存等等,所以提高 WordPre

Object-C知识点 (四) 性能优化

#pragma mark - 性能优化 1. 行高一定要缓存 缓存行高是解决性能优化的最佳途径(除非刷新频率已经很高了,否则一定要缓存)2. 尽量减少计算,所有需要素材提前计算好3. 控件不要设置圆角半径,图片的拉伸要用代码去处理,减少CPU和GPU的消耗4. 不要动态创建控件,需要展示的控件,都要提前创建好,在展示的时候根据数据隐藏或显示5. cell中的层次越少越好,数量越少越好(实现更好理解的前提下尽可能少)6. 高级优化 离屏渲染 self.layer.drawsAsynchronous

.NET程序性能优化基本要领

想了解更多关于新的编译器的信息,可以访问     .NET Compiler Platform ("Roslyn") 基本要领 在对.NET 进行性能调优以及开发具有良好响应性的应用程序的时候,请考虑以下这些基本要领: 要领一:不要过早优化 编写代码比想象中的要复杂的多,代码需要维护,调试及优化性能. 一个有经验的程序员,通常会对自然而然的提出解决问题的方法并编写高效的代码. 但是有时候也可能会陷入过早优化代码的问题中.比如,有时候使用一个简单的数组就够了,非要优化成使用哈希表,有时候

性能优化——应用服务器性能优化

核心知识点: 网站性能优化第一定律:优先使用缓存. 1.分布式缓存 (1)缓存原理 a.什么是缓存?(将数据存储在相对较高访问速度的介质中,以供系统处理) b.缓存的优点:访问速度快,如果需要计算可以减少计算时间 c.缓存的本质是一张以键值对存储的内存hash表 d.主要用来存储:读写比例高,很少变化的数据 e.网站的访问遵循28定律 (2)合理使用缓存应该注意以下问题 a.频繁更新的数据(数据还没有读就已经失效,一般要求读写比在2:1以上才有意义) b.没有热点数据(无疑浪费资源) c.数据不

前端性能优化成神之路-总结

首先来看一下前端性能优化所涉及的层面有如下四个:网络层面,构建层面,浏览器渲染层面,服务端层面 具体的优化点有:资源合并与压缩,图片编码原理和类型的选择,浏览器的渲染机制,懒加载与预加载,浏览器存储,缓存机制,PWA,Vue-SSR等等 首先来了解一下web前端的本质 web前端的本质是一种GUI软件,是可以直接借鉴其他GUI系统架构设计的方法,但是web前端有点特别 下面是CS架构的GUI软件的开发和部署过程,CS架构的GUI软件在用户从商店下载下来后,是一个APK包,通过解压安装到手机的操作