”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 提高 Spring Boot 应用程序的性能 - 第二部分

提高 Spring Boot 应用程序的性能 - 第二部分

发布于2024-11-09
浏览:481

Melhorando o desempenho de aplicações Spring Boot - Parte II

在本文的第一部分中,我们学习了如何提高应用程序的性能,将 Tomcat 替换为 Undertow,即高性能 Web 服务器,除了启用和配置数据压缩之外,还可以减少通过网络传输的 HTTP 响应的大小。

现在,我们将讨论如何在持久化部分提高Spring Boot应用程序的性能,但首先我们需要了解什么是JPAHibernateHikari.

日本PA

JPA 或 Java Persistence API,后来重命名为 Jakarta Persistence,是一种 Java 语言标准,描述了通用的数据持久化框架的接口

JPA 规范在内部定义对象关系映射,而不是依赖于特定于供应商的映射实现。

休眠

HibernateORM 框架之一,它具体实现了 JPA 规范。也就是说,如果在本规范中描述了需要 persistremoveupdatefetch data 的方法,那么谁会实际上构建这些行为的是Hibernate,以及EclipseLink,这是另一个ORM .

Hikari是一个连接池框架,它负责管理与数据库的连接,保持它们打开以便可以重用,即,它是用于未来请求的连接的缓存,使对数据库的访问更快并减少要创建的新连接的数量。

配置 Hikari、JPA 和 Hibernate

我们可以执行以提高性能的配置如下:

使用application.yml:


春天: 光: 自动提交: false 连接超时:250 最大寿命:600000 最大池大小:20 最小空闲:10 池名称:master 杰帕: 在视图中打开: false 显示sql:true 休眠: ddl 自动:无 特性: hibernate.connection.provider_disables_autocommit:true hibernate.generate_statistics:true
spring:
  hikari:
    auto-commit: false
    connection-timeout: 250
    max-lifetime: 600000
    maximum-pool-size: 20
    minimum-idle: 10
    pool-name: master

  jpa:
    open-in-view: false
    show-sql: true
    hibernate:
      ddl-auto: none
    properties:
      hibernate.connection.provider_disables_autocommit: true
      hibernate.generate_statistics: true
使用 application.properties:


spring.datasource.hikari.auto-commit=false spring.datasource.hikari.connection-timeout=50 spring.datasource.hikari.max-lifetime=600000 spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=10 spring.datasource.hikari.pool-name=master spring.datasource.jpa.open-in-view=false spring.datasource.jpa.show-sql=true spring.datasource.jpa.hibernate.ddl-auto=无 spring.jpa.properties.hibernate.generate_statistics=true spring.jpa.properties.hibernate.connection.provider_disables_autocommit=true
spring:
  hikari:
    auto-commit: false
    connection-timeout: 250
    max-lifetime: 600000
    maximum-pool-size: 20
    minimum-idle: 10
    pool-name: master

  jpa:
    open-in-view: false
    show-sql: true
    hibernate:
      ddl-auto: none
    properties:
      hibernate.connection.provider_disables_autocommit: true
      hibernate.generate_statistics: true
现在让我们简单总结一下选项:

  • spring.datasource.hikari.auto-commit:如果为 false,

    连接池返回的每个连接都会禁用自动提交

  • spring.datasource.hikari.connection-timeout:客户端等待来自

    的连接的时间(以毫秒为单位)。最好设置一个较短的超时以快速失败并返回错误消息,而不是让客户端无限期地等待。

  • spring.datasource.hikari.max-lifetime:连接可以保持活动状态的最长时间。配置此参数对于避免由于有问题的连接而导致失败并提高安全性至关重要,因为长时间处于活动状态的连接更容易受到攻击。

  • spring.datasource.hikari.maximum-pool-size:

    的最大大小,包括空闲和使用中的连接,确定数据库的最大活动连接数。如果池达到此限制并且没有空闲连接,则对 getConnection() 的调用将在失败之前阻塞最多 connectionTimeout 毫秒。

      找到一个合适的值很重要,因为许多人认为将其设置为 50、70 甚至 100 会获得出色的性能。理想的是最大为 20,这是
    • 线程的数量 使用连接并行。
    • 值越高,数据库管理这些连接就越困难,并且很可能我们将无法拥有足够的
    • 吞吐量来使用所有这些连接。
    • 重要的是要理解,从
    • RDBMS关系数据库管理系统)的角度来看,很难保持与其自身的开放连接,想象一下n个连接.
  • spring.datasource.hikari.minimum-idle:需求较低时池维持的最小连接数。该池最多可以减少 10 个连接,并根据需要重新创建它们。但是,为了获得最佳性能并更好地响应需求峰值,建议不要设置此值,从而允许 Hikari 作为固定大小池运行。默认值:与 spring.datasource.hikari.maximum-pool-size.

    相同
  • spring.datasource.hikari.pool-name:连接

    pool的用户定义名称,主要出现在注册表管理控制台和JMX中以标识及其配置。

日本PA

  • spring.datasource.jpa.open-in-view: 当启用

    OSIV (Open Session In View) 时,在整个请求过程中都会维护一个会话,即使没有@Transactional注释。这可能会导致性能问题,例如缺乏应用程序响应,因为会话会保持与数据库的连接直到请求结束。

  • spring.datasource.jpa.show-sql:显示我们的应用程序中正在执行的SQL日志。我们通常在开发中启用它,但在生产中禁用它。

  • spring.datasource.jpa.hibernate.ddl-auto:配置

    Hibernate相对于数据库的schema的行为。它可以具有以下值:

      无:不执行任何操作。我们手动管理银行的架构。
    • validate:验证数据库的
    • 架构,但不进行任何更改。这对于确保当前的架构与我们映射的实体一致很有用。
    • 更新:更新数据库的
    • 架构以反映实体的更改。
    • create:创建数据库的
    • 架构。如果架构已经存在,它将删除并重新创建它。
    • create-drop:从数据库创建
    • schema,并在应用程序结束时删除 schema。对于测试很有用,我们希望每个测试都有一个干净的数据库。
  • spring.jpa.properties.hibernate.generate_statistics:用于收集有关 Hibernate 的详细信息,例如查询执行时间、执行的查询数量和其他指标。

  • spring.jpa.properties.hibernate.connection.provider_disables_autocommit:通知

    Hibernate我们已经禁用了提供者的自动提交 PostgreSQLMySQL等)。这会影响性能,因为Hibernate需要从获取连接才能知道自动提交是否启用,对于他所做的每笔交易。

至此,我们结束本文的第二部分。并非所有设置都与性能有关,但真正影响的是

Hikari 设置,例如 自动提交池大小JPAHibernate 的那些,如 OSIV在视图中打开会话)并通知您我们已禁用 providers自动提交

在下一部分中,我们将讨论异常以及如何配置它们,以节省

JVMJava 虚拟机)的资源。

参考:

    https://en.wikipedia.org/wiki/Jakarta_Persistence
  • https://www.ibm.com/docs/pt-br/was/8.5.5?topic=SSEQTP_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/cejb_persistence.htm
  • https://github.com/brettwooldridge/HikariCP
  • https://github.com/corona-warn-app/cwa-server/issues/556
  • https://medium.com/@rafaelralf90/open-session-in-view-is-evil-fd9a21645f8e
版本声明 本文转载于:https://dev.to/mathstylish/melhorando-o-desempenho-de-aplicacoes-spring-boot-parte-ii-nbi?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 以下是一些标题选项,请记住问题格式:

简单直接:

* 如何用JavaScript动态调整输入字段宽度?
* 创建响应式输入字段:JavaScript So
    以下是一些标题选项,请记住问题格式: 简单直接: * 如何用JavaScript动态调整输入字段宽度? * 创建响应式输入字段:JavaScript So
    动态调整输入字段的宽度以适应其输入动态调整输入字段的宽度以匹配其内容长度可以增强用户体验防止布局混乱。虽然设置固定宽度可能会导致多余的空间或截断文本,但动态方法可确保输入字段具有视觉吸引力和功能性。不幸的是,使用 CSS 的 min-width 属性设置最小宽度不适用于输入字段。然而,现代浏览器提供...
    编程 发布于2024-11-09
  • 如何使用 JavaScript 从 iFrame 重定向父窗口?
    如何使用 JavaScript 从 iFrame 重定向父窗口?
    从 iFrame 重定向父窗口如果父窗口中嵌入了 iFrame,则可能需要重定向父窗口窗口的位置更改为新的 URL。为了实现这一点,JavaScript 提供了一个简单的解决方案。使用 JavaScript 重定向父窗口在 iFrame 的 JavaScript 代码中,您可以使用以下方法: 重定向...
    编程 发布于2024-11-09
  • 如何使用 Curl 模拟 Web 浏览器的 GET 请求?
    如何使用 Curl 模拟 Web 浏览器的 GET 请求?
    使用 Curl 模拟 Web 浏览器的 GET 请求尝试使用curl 检索网页时,您可能会遇到似乎源于以下原因的错误无法识别或未实现的请求标头。这是因为curl本身并不模拟Web浏览器的GET请求标头。要正确模拟Web浏览器,请按照下列步骤操作:配置用户代理:使用CURLOPT_USERAGENT为...
    编程 发布于2024-11-09
  • 通过“从参数中提取信息”项目释放您的 Python 能力
    通过“从参数中提取信息”项目释放您的 Python 能力
    您准备好将您的 Python 技能提升到新的水平了吗? LabEx 提供的“从参数中提取信息”项目就是您的最佳选择。这个引人入胜的项目将指导您完成从给定文本中提取数字、计算平均值并将结果格式化为小数点后两位的过程。潜入并释放你作为 Python 程序员的真正潜力! 踏上激动人心的旅程...
    编程 发布于2024-11-09
  • HTML 表单中的默认提交按钮行为是什么?
    HTML 表单中的默认提交按钮行为是什么?
    确定 HTML 表单中的默认提交按钮在未单击特定提交按钮的情况下提交 HTML 表单时,例如按 输入或在 JavaScript 中使用 HTMLFormElement.submit(),浏览器需要确定多个提交按钮(如果有)中的哪一个应被视为按下的按钮。此确定对于触发 onclick 事件处理程序和发...
    编程 发布于2024-11-09
  • 如何在Python中实现异步Shell命令执行:探索最佳实践
    如何在Python中实现异步Shell命令执行:探索最佳实践
    Python 中的异步 Shell 命令执行:探索替代方法从 Python 脚本异步运行外部命令是一项有价值的技术,允许持续执行脚本当外部命令执行其任务时。本文探讨了实现这种异步行为的适当方法,重点关注 os.system() 和 subprocess.Popen.os.system() 和 & 符...
    编程 发布于2024-11-09
  • 状态测试用例中的 ReactDOM.unstable_batchedUpdates。
    状态测试用例中的 ReactDOM.unstable_batchedUpdates。
    在本文中,我们将研究 ReactDOM.unstable_batchedUpdates 在测试用例中的使用,特别是在 Zustand(React 的流行状态管理库)中。我们还将分解测试并解释批量更新如何通过最小化不必要的重新渲染来增强 React 的性能。 理解测试用例 这是我们将要...
    编程 发布于2024-11-09
  • 如何使用 jQuery 和 CSS 创建响应式水平页面滑动系统?
    如何使用 jQuery 和 CSS 创建响应式水平页面滑动系统?
    响应式水平页面滑动问题设计响应式水平导航系统面临几个挑战:维护页面视口内的可见性防止页面之间出现间隙或重叠允许页面超出 100% 高度,并具有滚动条可见性确保与 Internet Explorer 9 或更高版本的兼容性解决方案此解决方案采用 jQuery 并包含以下主要功能:响应式大小调整: 脚本...
    编程 发布于2024-11-09
  • 为什么编译器中的“static_assert”与非类型模板参数的行为不同?
    为什么编译器中的“static_assert”与非类型模板参数的行为不同?
    编译器中非类型模板参数的 static_assert 行为不一致在 C 中, static_assert 可用于在编译时验证条件。然而,最近的观察发现,当 static_assert 与不同编译器中的非类型模板参数结合使用时,其行为存在差异。具体来说,以下代码片段:template <int ...
    编程 发布于2024-11-09
  • 何时以及如何在 JavaScript 的 parseInt() 函数中使用 Radix?
    何时以及如何在 JavaScript 的 parseInt() 函数中使用 Radix?
    了解 parseInt 中对基数的需求JavaScript 中的 parseInt() 函数允许您将表示数字的字符串转换为整数。但是,您可能并不总是希望将整数解析为以 10 为基数的数字。这就是基数参数发挥作用的地方。什么是基数?基数是指在数字系统中单个数字可以表示的值的数量。例如,我们常用的十进制...
    编程 发布于2024-11-09
  • 尝试重载队列构造函数
    尝试重载队列构造函数
    该项目旨在通过添加两个新的构造函数来改进 Queue 类。 第一个构造函数将从另一个现有队列创建一个新队列。 第二个构造函数将允许您创建具有初始值的队列。 这些构造函数显着提高了 Queue 类的可用性。 1 创建一个名为 QDemo2.java 的文件,并将更新后的 Queue 类从 Try T...
    编程 发布于2024-11-09
  • 实施订单处理系统:零件监控和警报
    实施订单处理系统:零件监控和警报
    1. Introduction and Goals Welcome to the fourth installment of our series on implementing a sophisticated order processing system! In our pre...
    编程 发布于2024-11-09
  • 以客户端为中心的错误处理
    以客户端为中心的错误处理
    了解和处理错误 为了有效地处理错误,必须了解可能发生的错误类型。让我们首先对您可能遇到的错误进行分类。 Web 客户端环境中的错误类型 网络错误 连接问题:与服务器建立连接时出现问题。 超时:请求花费太长时间才能收到响应。 DNS 错误:域名解析问题...
    编程 发布于2024-11-09
  • 如何在Python中高效计算目录大小?
    如何在Python中高效计算目录大小?
    使用 Python 进行目录大小计算为了测量目录的空间占用情况,Python 提供了几种方法。下面我们深入探讨一个高效、全面的解决方案:import os def directory_size(start_path): total_size = 0 for root, directo...
    编程 发布于2024-11-09
  • 如何修复Go模块导入过时的包版本?
    如何修复Go模块导入过时的包版本?
    Go 模块导入过时的包版本尝试使用 Go 模块将新包合并到项目中时,您可能会遇到以下问题:尽管该包被标记为“最新”,但模块系统检索该包的过时版本。这个过时的版本可能缺少代码所需的功能,从而导致编译或运行时错误。解决方案:在 go.mod 文件中指定版本Go 模块系统允许您可以指定要导入的包的确切版本...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3