」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 提高 Spring Boot 應用程式的效能 - 第二部分

提高 Spring Boot 應用程式的效能 - 第二部分

發佈於2024-11-09
瀏覽:183

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]刪除
最新教學 更多>
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    程式設計 發佈於2025-04-13
  • CSS打造酷炫幽靈按鈕
    CSS打造酷炫幽靈按鈕
    [2 最近,我尋求編碼靈感,缺乏藝術才能。我的方法? 複製他人的視覺吸引力創作,重點關注清潔,簡潔的代碼。 這些糖果幽靈按鈕引起了我的注意! 它們似乎非常適合快速項目。 在十五分鐘內,我在鉻中實現了這一目標: 該技術值得共享。 本文詳細介紹了我的過程並探討了替代方法。 初始設置 一個簡單的...
    程式設計 發佈於2025-04-13
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的Python功能Eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。本文深入研究了eval()和ast.literal_eval()之間的差異,突出顯示其安全性含義...
    程式設計 發佈於2025-04-13
  • 如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    程式設計 發佈於2025-04-13
  • 使用jQuery如何有效修改":after"偽元素的CSS屬性?
    使用jQuery如何有效修改":after"偽元素的CSS屬性?
    在jquery中了解偽元素的限制:訪問“ selector 嘗試修改“:”選擇器的CSS屬性時,您可能會遇到困難。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    程式設計 發佈於2025-04-13
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣,如何? 答案:是的,可以將您的Encryption庫從McRypt升級到OpenSSL。 可以使用openssl。 附加說明: [openssl_decrypt()函數要求...
    程式設計 發佈於2025-04-13
  • SQL Server中如何高效地將列轉換為行?
    SQL Server中如何高效地將列轉換為行?
    SQL Server中列轉行的深度指南 當處理包含大量指標列的表時,將這些列轉換為行對於分析和報告目的非常有利。此轉換涉及重新構建數據以創建具有不同架構的新表。 問題陳述 考慮以下表架構: [ID] [EntityID] [Indicator1] [Indicator2] [Indicator3...
    程式設計 發佈於2025-04-13
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-04-13
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-04-13
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-04-13
  • PHP超時錯誤解決方案:執行時間限制處理指南
    PHP超時錯誤解決方案:執行時間限制處理指南
    處理最大執行時間超過php 當PHP腳本超過其最大允許的執行時間時,它會以致命的錯誤終止。雖然增加執行時間限制是一個常見的解決方案,但它可能並不總是實用的。本文探討了一種捕獲此錯誤並減輕其對用戶體驗的影響的替代方法。 錯誤檢測和處理使用此關閉功能,我們可以捕獲最大執行時間超過錯誤。 預期outpu...
    程式設計 發佈於2025-04-13
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-13
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-04-13
  • CodeIgniter認證庫哪款最佳?安全與功能的平衡
    CodeIgniter認證庫哪款最佳?安全與功能的平衡
    How to Choose the Right Authentication Library for CodeIgniter?Selecting an authentication library for CodeIgniter involves considering several factor...
    程式設計 發佈於2025-04-13
  • 深入解析Worker Threads與子進程
    深入解析Worker Threads與子進程
    工作線程允許您在多個線程中運行JavaScript代碼。它們非常適合通過共享ArhenArrayBuffer在線程之間共享內存,並用於卸載CPU結合的任務(例如數據處理或計算)。 [2 兒童進程使您能夠產生單獨的進程,從而獨立於主node.js進程運行任務。它們適合需要隔離的任務或使用非JavaSc...
    程式設計 發佈於2025-04-13

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3