读Java性能权威指南(第2版)笔记06_数据库性能JPA&SpringData

java 性能权威指南.pdf [美]scott Oaks著 java 性能权威指南.pdf [美]scott Oaks著 是java调优实战的指导书 立即下载

bb07d6b860664426a865c8b9a2363b4d.jpeg

 

1. JPA

1.1. 性能直接受底层JDBC驱动性能的影响

1.2. 性能提升是通过改变实体类的字节码来实现的

1.2.1. 在类加载到JAR文件或者由JVM运行之前增强字节码的方法

1.2.1.1. 在编译过程中完成的

1.2.1.2. 在实体类编译完成后,它们会被传递给一个特定实现的后置处理器

1.2.1.3. 该后置处理器会“增强”字节码,产生一个修改过的类文件,其中包含所需的优化

1.2.2. 在类被加载到JVM时动态增强字节码的方法

1.2.2.1. 在JVM中运行一个代理,当类被加载时,代理会收到通知并介入类加载的过程,在字节码定义类之前对其进行修改

1.2.2.2. 代理是在应用程序的命令行上指定的

2. 优化JPA写

2.1. 写入更少的字段

2.2. 可以从限制数据库的写入调用数量中获益

2.3. 语句池可以在JPA层面或JDBC层面实现

2.3.1. 应该首先尝试在JDBC层面实现

2.3.2. 如果JDBC驱动能够提供语句池,通常最好在驱动中启用语句池,并将从JPA的配置中删除语句池配置

2.4. JDBC驱动不能自动实现语句批处理

2.4.1. 设置size属性

2.4.2. JPA的批量更新可以用声明的方式在persistence.xml文件中完成

2.4.3. 应用程序可以定期调用实体管理器的flush()方法,这个调用会立即执行所有需要批量处理的语句

3. 优化JPA读

3.1. 读取更少的数据

3.1.1. 因为有些数据不需要

3.1.2. 目的

3.1.2.1. 在检索实体时可以让SQL更快

3.1.2.2. 可以节省大量内存,从而减少了GC压力

3.1.3. 指定需要延迟加载的相关字段

3.1.3.1. 当一个实体被检索时,带有延迟加载注解的字段将被排除在用于加载数据的SQL之外

3.1.3.2. 对于基本类型的简单列,很少使用

3.1.3.3. 基于BLOB或基于CLOB的大型对象考虑使用

3.1.3.4. 延迟加载注解最终只是对JPA实现的建议

3.1.3.4.1. JPA实现可以自由决定数据库是否立即提供该数据

3.2. 一次读取更多的数据

3.2.1. 因为将来肯定需要这些数据

3.3. 提取组(fetch group)

3.3.1. 非标准JPA

3.3.2. 可以将某些延迟加载字段指定为一组,在其中一个字段被访问时,整个组都会被加载

3.3.3. 多个独立的字段组,每个组会在需要时被加载

3.4. 立即提取(eager fetching)

3.4.1. 当获取一个实体时,其他相关实体的数据也应该被返回

3.5. 在查询中使用JOIN

3.5.1. 特殊的@JoinFetch注解,它也可以用于连接提取关系

3.5.2. 选择立即加载关系时,可以使用命名查询来发出一条使用JOIN的SQL语句

3.6. 处理结果集

3.6.1. 一次获取所有结果

3.6.2. 在程序遍历查询结果时一次获取一个结果

3.6.3. 一次获取几个结果

3.7. 命名查询的速度更快

3.7.1. JPA实现几乎总是使用带有绑定参数的预处理语句,同时利用语句缓存池

4. JPA缓存

4.1. 提供一个中间层来缓存后端数据库返回的数据

4.1.1. 缓存频繁使用的数据可以大幅缩短客户端的响应时间

4.1.2. JPA缓存只对通过主键访问的实体进行操作

4.2. 一级缓存

4.2.1. L1缓存

4.2.2. 实体管理器中的本地缓存

4.2.3. 几乎不需要优化

4.2.4. 在所有JPA实现中都是开启的

4.3. 二级缓存

4.3.1. L2缓存

4.3.2. 全局缓存

4.3.3. 在所有的实体管理器之间共享的

4.3.4. 不是所有的JPA实现都会默认开启它

4.3.5. L2缓存会自动为应用程序缓存实体

4.3.6. 当有很大的JPA L2缓存时,堆的优化对于良好的性能就相当重要了

4.4. 通过查询检索到的数据不会保存在L2缓存中

4.4.1. 即使JPA实现支持查询缓存,实体本身也不会存储在L2缓存中,也不能在随后调用find()方法时被返回

4.4.2. 只有在每次执行查询时,查询中使用的参数完全相同的情况下,查询缓存才会起作用

4.4.3. 除非正在使用的JPA实现支持查询缓存,否则使用JOIN查询经常会对性能造成负面影响,因为它没有利用L2缓存

4.4.4. 从长远来看,避免查询是有益的

4.5. 当所有的数据都被使用时,立即加载和延迟加载的性能基本相同

4.6. 当关系数据没有被实际使用时,延迟加载会节省一些时间

4.6.1. 特别是在循环第一次执行时

4.6.2. 循环的后续执行并不会节省时间

4.6.2.1. 在这些后续的迭代中,立即加载的代码并没有重新加载数据,它是从L2缓存中查找的数据

4.7. 如果实体都不是通过查询检索到的,那么在初始的预热期之后,通过L2缓存可以访问所有的实体

4.7.1. 即使SQL语句返回多行数据,JPA仍然能够缓存实体,这和执行查询不同

4.7.2. 如果通过遍历实体来预热L2缓存,不要单独遍历相关实体,通过访问关系来遍历更简单

4.8. 如果缓存消耗了太多内存,就会给GC造成压力

4.8.1. 设置缓存大小的选项

4.8.1.1. 针对全局的

4.8.1.2. 针对每个实体的

4.8.2. 另一种可用方法是让L2缓存使用软引用或/和弱引用

4.8.2.1. 比为每个实体找到最佳大小要容易一些

4.8.2.2. 弱引用在任何GC操作中都会被回收

5. Spring Data

5.1. 关系数据库和NoSQL数据库的数据库访问模块集合

6. Spring Data JDBC

6.1. JPA的一个简单替代方案

6.2. 提供了类似于JPA的实体映射

6.3. 没有缓存、延迟加载或脏实体跟踪等功

7. Spring Data JPA

7.1. 标准JPA的包装器

7.2. 减少开发人员需要编写的模板代码量

7.2.1. 提高开发人员的效率

7.2.2. 并不能真正影响应用程序性能

8. Spring Data for NoSQL

8.1. 各种NoSQL和类NoSQL技术的连接器

8.2. MongoDB

8.3. Cassandra

8.4. Couchbase

8.5. Redis

9. Spring Data R2DBC

9.1. 允许对Postgres、H2和Microsoft SQL Server数据库进行异步访问

9.2. 遵循典型的Spring Data编程模型

9.3. 不是直接使用JDBC

9.4. 和Spring Data JDBC类似

9.5. 通过仓库中的简单实体进行访问

9.6. 没有缓存、延迟加载和JPA的其他功能

 

SYSU-MM01数据集评估避坑指南:从RGB/IR图像理解到Python评估脚本调优 本文详细解析了SYSU-MM01数据集在跨模态行人重识别(ReID)评估中的关键技巧与常见陷阱。从RGB/IR图像理解到Python评估脚本优化,提供了数据评估模式选择、single-shot/multi-shot差异分析、特征文件处理规范等实用指南,帮助研究者避开指标异常问题,提升评估效率与准确性。 阅读详情

相关推荐

基于Python的MGWR多尺度地理加权回归模型

多尺度地理加权回归(MGWR)变量之间的关系在地理空间上不是均一的,所有特征变量的影响都在不同的空间范围(带宽)内变化,某些变量可能表现出局部性影响(小带宽),某些变量可能表现出全局性影响(大带宽),通过优化每个特征变量的带宽,捕捉到空间关系的多尺度特性,得到更细致的模型解释。

weixin_61965078的博客 3854

读Java性能权威指南(第2版)笔记29_线程和同步性能下

4.3. 在Windows上,Java优先级较高的线程往往比优先级较低的线程运行得更多,但即使是低优先级的线程也会获得相当多的CPU时间。4.1. 每个Java线程都有一个由开发人员定义的优先级,这是对操作系统的一种提示,用来说明程序认为特定线程有多重要。2.4. 在Unix风格的系统上,用户创建的进程(他们正在运行的所有程序)已经达到了此次登录配置的最大进程数。2.1. 在32位的JVM中,进程使用的内存达到了4 GB(或者小于4 GB,取决于操作系统)的最大大小。

lyingSeven的博客 178

Vivado2022.2下载安装

链接:https://pan.baidu.com/s/1lyfE2d-VmaWC-_aR8ratCQ提取码:mt09。

weixin_61081689的博客 2万+

《Java性能权威指南》

《Java性能权威指南》

天的博客 622

宜搭子表单(自定义页面全部展示)

效果:增加自定义页面添加表格组件,配置数据源变量: formUuid'表单编码'变量: pageSize10变量: currentPage1。

2301_80286061的博客 2279

Rosetta基础2:preparing ligand

Rosetta是基于残基,也就是说Rosetta不把原子单独对待,而是把它们看作一个完整的化学实体。为了实现这个目标,Rosetta必须知道键长、键角以及其它性质。对标准残基和小分子残基模型都是必须的。Rosetta在params文件中对残基的性质进行编码。Rosetta数据库包含常见氨基酸残基和小分子残基的parmas文件。当我们添加新的配体时,需要生成新的parms文件。 What is a Params File params文件包含残基的几何形状和化学特征的信息,为了让Rosetta理解怎样运行这个

li1guangjun的博客 1755

读Java性能权威指南(第2版)笔记30_Java服务器

3.4. 像所有受限于CPU的情况一样,线程的数量没有必要比运行服务器的机器或容器的虚拟CPU数量多,因为永远没有办法运行那么多的线程。3.2. 选择器通知有客户端I/O待处理之后,另一个包含工作线程的线程池会处理实际的请求和响应。4.5. 与使用传统I/O构建的客户端相比,使用NIO构建的异步HTTP客户端需要的线程更少。4.4.3.2. 请求的连接超过了配置的数量,它们会在需要的时候被创建,在完成任务后被销毁。3.6.3. 在排队等待响应之前,看看异步线程池的状态,如果系统太忙,就拒绝请求。

lyingSeven的博客 302

用python将dycom .dcm格式图像转换为nifti .nii

因为发现目前搜索到的多数中文教程并不能正确将FMRI图像正确转换,例如很多用simpleITk的seriesreader的,所以写了一下自己正确转换的方法。因为FMRI是一个4D数据,有时间轴,所以用seriesreader读写出来的图像把时间轴维度给降维了。当然你用SPM12工具的dycom import也是能正确转换的,但是我还是喜欢python这样的,代码直接简单。

qq_41103479的博客 3609

读Java性能权威指南(第2版)笔记22_ 操作系统工具和Java监控工具

2.8.3. 如果运行队列在相当长的时间内过长,那就说明机器已经过载,需要想办法减少机器当前的工作量。2.6.2.2. 不要仅仅因为有空闲的CPU可用,就认为应该增加线程池的大小以完成更多的工作。5.1.4. product表示该标志的默认设置在所有平台是统一的。4.5.3. 显示了命令行设置的标志和JVM直接设置的一些标志。5.1.3. 没有冒号,表示当前的值是这个版本JVM的默认值。2.8.2.2. 处理器队列长度不包含正在运行的线程的数量。2.8.1.2. 运行队列表示的是机器上所有的进程信息。

lyingSeven的博客 270

【MBD开发】Simulink中的枚举

01 什么是枚举 按百度百科的词条【枚举】是在编程语言中用来存储一组固定的常量。不同编程语言的枚举语法也不一样,以C语言为例。 typedef enum{ GEAR_P, //0:P挡 GEAR_R, //1:倒挡 GEAR_N, //2:空挡 GEAR_D, //3:前进}_GEAR; 上面枚举了一个_GEAR数据,用GEAR_P表示0,GEAR_R表示1……​​​​​​​ if(current_gear==GEAR..

f6723的博客 3096

Linux 设置双网卡通信,外网网卡和内网网卡

背景,Linux 主机已经安装了内网、外网 2 张网卡,目前外网网络已通,需要设置内网网卡转发通内网 内网需要通信的设备的网段,如果 10.99.0.0 代表 10.99 网段的所有 IP 表示 10.xx 网段走 10.xx.xx.xx 这个网关转发 :内网网卡设备示例 2、设置启动自动生效 打开 文件,如果没有则创建该文件,然后在文件内写入如下的内容修改上面的语句 为 即可 示例...

简简单单Onlinezuozuo 6605

Spring Data JPA和MyBatis的区别,及Spring Data JPA的简单实例

它通过使用注解和接口的方式,提供了一种简化数据库访问的方式。MyBatis是一个开源的持久化框架,它使用XML或注解来配置SQL语句,并提供了灵活的映射机制。它适用于复杂的SQL查询和特定的数据库操作,尤其适合需要手动优化SQL语句或使用原生SQL的场景。它适用于大部分的CRUD操作和简单查询,尤其适合对实体对象进行增删改查的操作。需要注意的是,Spring Data JPA和MyBatis并不是互斥的,可以在同一个项目中同时使用它们,根据具体的需求来选择使用哪个框架。实体类,定义了其属性和注解。

六六的博客 1683

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3458

Mybatis和Spring Data Jpa的优缺点比较(八股文)

八股文

软件Java开发工程师 6222

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

不愧是Alibaba技术官:程序员必会的架构知识清单,如何让你技术上的提升面试时的丰收

该文档在Github上收获45K+star的Java核心神技(这参数,质量多高就不用我多说了吧)非常全面,包含基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等内容非常丰富,已经帮很多人拿下互联网一线公司的offer。 关于程序员,除了做项目来提高自身的技术之外,还有一种提升自己的专业技能就是:多!看!书! 好好吃透消化,让你面试跳槽不再心慌! JAVA基础

AMSRY的博客 3313

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring Data JPA 提供的功能在性能方面有哪些需要注意的地方?

Spring Data JPA 简化了数据访问层的开发,但背后也隐藏着一些性能方面的注意事项。Spring Data JPA 提供了极大的便利,但也容易因为忽视细节而导致性能问题。

专注于技术分享 1373

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java ORM框架深度解析:Hibernate、MyBatis与Spring Data JPA对比

本文深入探讨了Java开发中常用的ORM框架,包括Hibernate、MyBatis和Spring Data JPA。通过对其核心特性、易用性、性能表现和实际应用场景进行对比分析,旨在帮助Java开发者理解各种ORM框架的优势与不足,从而在项目中做出更明智的技术选型,提升开发效率和应用性能。

专注分享编程开发与技术进阶干货! 1550

Spring Data Jpa 缓存

JPA仅仅只是一个规范,而不是产品;使用JPA本身是不能做到持久化的。所以,JPA只是一系列定义好的持久化操作的接口,在系统中使用时,需要真正的实现者,在这里,我们使用Hibernate作为实现者。 JPA规范中定义了很多的缓存类型:一级缓存,二级缓存,对象缓存,数据缓存 wiki的jpa缓存介绍 hiberna...

weixin_33695450的博客 2374

Spring Data JPA 动态查询:Specification、QueryDSL 与原生 SQL 对比

QueryDSL 通过 APT(Annotation Processing Tool)在编译期生成Q 类(如QOrderQUser),实现完全类型安全的查询。</</</</</</</</</</</</</</</</</</</</</</</</</编译后生成的 Q 类(位于import com// ... }// ... }// ... }// ... }javatime// ... }

开发小能手-Haha king的博客 269

Spring Data JPA 与 MyBatisPlus的比较

Column;Entity;Id;Table;JPA支持接口规范方法名查询,一般查询方法以 find、findBy、read、readBy、get、getBy为前缀,JPA在进行方法解析的时候会把前缀取掉,然后对剩下部分进行解析。// 调用此方法时,会自动生成 where code =?的条件。

118路司机的博客 7165

Spring Data JPA批量处理性能优化

我们使用JPA的saveAll的时候,会发现这个方法特别慢,我在本地做的测试是插入10万条数据的时候,耗时51503ms,和JDBC方式的批量处理对比后就会发现,性能差了百倍,所以我们要优化下我们的代码。 一:修改setId的策略 我们观察就会发现,在saveAll传入的对象里面,设置了id的情况下,JPA会根据id去执行一条select语句,数据量越多,和数据库交互次数越多,这个操作会极大的拖慢性能,那我们首要解决的,就是不让JPA去执行select。解决办法有两个,麻烦一点的是这样的,实

李秀才的博客 8190

读Java性能权威指南(第2版)笔记09_即时编译器下

GraalVM优化代码时并没有C2编译器那么激进,所以对于运行得足够久的应用程序,传统的JVM最终会胜出。如果不让预编译的方法被C2编译器编译,那么服务器预热后的性能就会比它最终可能达到的性能差。给定足够长的预热期,禁用分层编译时的执行情况和开启时应该是差不多的。生成的二进制文件启动速度很快,特别是相较于在JVM中运行的程序。对于很小的、快速运行的程序没有帮助,甚至会阻碍它们的运行。原生程序的内存占用在开始时比传统JVM少得多。当在内存受限的环境中运行时有理由关闭它。对于比较大的程序有好处。

lyingSeven的博客 375

读Java性能权威指南(第2版)笔记18_垃圾回收E

2.5.5.1. 设定你希望应用程序在GC上花费的时间(相对于应用程序线程应该运行的时间)2.5.3.4. 如果使用了一个非常小的值,那么应用程序最终会得到一个非常小的老年代。3.11.1.2. 避免这些失败的最简单的方法(在可能的情况下)是增加堆的大小。2.4.2.2.1. 增加堆的大小可以减少Full GC停顿的次数。3.8.2.2. 并发模式失败随着堆的增长而影响更大的原因之一。3.11.4.5. 此处的占用率是基于老年代的,而不是整个堆。2.4.2.1.1. 更大的堆会消耗机器上更多的内存。

lyingSeven的博客 201

书单 | 不可不读的Java图书,第2弹!

不可不读的Java书单第2弹来啦!Java性能权威指南(第2版)作者:[美] 斯科特·奥克斯(Scott Oaks)译者:党文亮既通透又实用的JVM性能优化读物,助你拨云见日- JVM性能优化内幕,涵盖Java 8和Java 11等常用版本- Java性能团队前核心成员心血之作- 中高级程序员必读佳作简介:本书从JVM和Java API两个方面,深入地介绍了Java 长期支持版本中影响性能的因素...

图灵教育 290

JPA批量操作及性能比对

假设需要批量插入10000条实体数据至数据库。如下是各个操作方法及耗时环境Spring boot 1、JDBC(JdbcTemplate) pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter...

你的才华撑不起野心时,静下心学习;你的能力驾驭不了目标时,沉下心努力 1486

读Java性能权威指南(第2版)笔记02_ Java SE API技巧上

千万不要在循环中使用字符串连接,除非连接的字符串不会在循环的下一次迭代中使用。当你转到一个较新的版本时,不需要重新编译旧代码,因为字节码会是一样的。String类的intern()方法来创建字符串的标准化版本。想用新的编译器编译出新的代码,以使用新的语言特性。例外是应用程序中所有的字符串都需要16位编码。String.equals()方法是相当快的。JDK 8的优化在处理字符串和整数时效果很好。使用String类的intern()方法。自定义方法来创建字符串的标准化版本。G1 GC执行自动去重。

lyingSeven的博客 182
上一篇: 读Java性能权威指南(第2版)笔记05_数据库性能JDBC
下一篇: 读Java性能权威指南(第2版)笔记07_即时编译器上
躺柒
博客等级 码龄4年 7004粉丝 1322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值