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

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

發佈於2024-11-08
瀏覽:378

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]刪除
最新教學 更多>
  • 將 UNIX 時間戳轉換為日期時,為什麼 SimpleDateFormat.parse 的輸出與指定的不同?
    將 UNIX 時間戳轉換為日期時,為什麼 SimpleDateFormat.parse 的輸出與指定的不同?
    SimpleDateFormatter.parse 輸出與指定不同使用SimpleDateFormat 將UNIX 時間戳記轉換為日期時,您可能會遇到指定格式與實際格式之間的差異輸出。 在給定的範例中,目標是轉換 UNIX 時間戳記(“a1527069600”)轉換為“dd/MM/yyyy hh:m...
    程式設計 發佈於2024-11-09
  • 如何簡化 Go 中的結構驗證:慣用方法與「go-validator」?
    如何簡化 Go 中的結構驗證:慣用方法與「go-validator」?
    在 Go 中驗證結構體驗證結構體值的有效性是軟體開發中的關鍵任務。當處理大量小結構時,單獨檢查每個欄位可能會很麻煩。讓我們探討一下驗證結構的慣用方法和替代解決方案。 慣用驗證提供的範例是驗證結構的常見方法。使用結構體的方法單獨檢查每個欄位。然而,隨著字段或結構體數量的增加,這種方法變得乏味。 替代解...
    程式設計 發佈於2024-11-09
  • 如何使用 PHP 取得 MySQL 中父節點的所有子節點和後代節點?
    如何使用 PHP 取得 MySQL 中父節點的所有子節點和後代節點?
    使用PHP 結合MySQL 查詢結果獲取父級下的所有子節點、孫子節點等本文將引導您完成一種檢索所有子節點和後代節點的方法使用PHP 和MySQL 查詢結果的指定父級。這種技術消除了建構樹結構的多維數組的需要,使您能夠直接獲取所有節點。 考慮一個以鄰接列表形式組織的 MySQL 表,其中層次結構資料由...
    程式設計 發佈於2024-11-09
  • 如何解決 Ajax XMLHttpRequest 檔案上傳中的「未找到多部分邊界」錯誤?
    如何解決 Ajax XMLHttpRequest 檔案上傳中的「未找到多部分邊界」錯誤?
    使用Ajax XMLHttpRequest 上傳檔案:解決「未找到多部分邊界」錯誤嘗試使用XMLHttpRequest 上傳檔案時,您可以遇到類似「請求被拒絕,因為未找到多部分邊界」的錯誤。當檔案未以 multipart/form-data 要求正確傳送時,就會出現此問題。 一個常見錯誤是將文件直接...
    程式設計 發佈於2024-11-09
  • HTML/CSS 課程 - 課程或年級
    HTML/CSS 課程 - 課程或年級
    HTML/CSS 课程 - 第 1 课细分 第 1 课:基本 HTML 回顾和高级 HTML 元素简介 客观的: 刷新基础 HTML 标签。 引入中级HTML元素来构建更多功能的网页。 1。 HTML结构简介 首先简要说明 HTML 如何使用标签组织网页内容。强...
    程式設計 發佈於2024-11-09
  • 如何最小化 Go 中禁用追蹤日誌記錄語句的成本?
    如何最小化 Go 中禁用追蹤日誌記錄語句的成本?
    Go 中禁用語句的低成本追蹤日誌記錄在Go 中,追蹤日誌記錄提出了一個獨特的挑戰:最大限度地減少關鍵路徑中停用日誌語句的成本。與 C/C 不同,Go 沒有預處理器宏,因此有必要探索替代解決方案。 一種方法涉及使用 fmt.Stringer 和 fmt.GoStringer 介面。透過延遲格式化直到日...
    程式設計 發佈於2024-11-09
  • 如何在 Go 中使用自訂 UnmarshalJSON 處理嵌入式結構?
    如何在 Go 中使用自訂 UnmarshalJSON 處理嵌入式結構?
    錯誤處理:嵌入式結構的自訂解組在Go 中,當將JSON 資料解組到具有嵌入式欄位的結構時,如果嵌入式結構定義了自己的UnmarshalJSON 方法。這是因為 JSON 函式庫呼叫嵌入結構的 UnmarshalJSON 並忽略包含結構中定義的欄位。 案例研究考慮以下結構定義:type Outer s...
    程式設計 發佈於2024-11-09
  • 帶有虛擬主機的 PHP Apache 項目
    帶有虛擬主機的 PHP Apache 項目
    建立專案目錄 首先,為您的專案建立目錄。例如,讓我們建立一個名為 php: 的目錄 sudo mkdir /var/www/html/php 建立 PHP 測試文件 在專案目錄中建立一個index.php檔案: echo "<?php phpinfo(); "...
    程式設計 發佈於2024-11-09
  • 如何在 JavaScript 中基於唯一屬性合併物件陣列?
    如何在 JavaScript 中基於唯一屬性合併物件陣列?
    在JavaScript 中基於唯一項組合數組合併數組可能是JavaScript 中的一項常見任務,特別是當需要基於以下項組合資料時具體標準。在此特定實例中,目標是組合基於共享 lineNumber 屬性的物件數組,從而產生具有 lineNumber 的物件數組和對應 cellWidth 值的數組。 ...
    程式設計 發佈於2024-11-09
  • 如何在共享託管平台上安裝 Composer?
    如何在共享託管平台上安裝 Composer?
    在共享託管平台上訪問Composer在共享託管環境上安裝Composer 面臨著獨特的挑戰,但只要採取正確的方法,這是可能的。讓我們探索一種行之有效的方法,在共享主機上取得 Composer,為您提供必要的可存取性。 首先,在您的系統上找到下載的composer.phar 檔案。找到後,繼續執行以下...
    程式設計 發佈於2024-11-09
  • 了解 DOM 事件
    了解 DOM 事件
    DOM 事件使網頁具有互動性。使用 DOM 事件可以實現頁面點擊或表單提交,它可以讓開發人員創建引人入勝的使用者體驗。 DOM 事件的一些範例包括使用者點擊滑鼠時、載入網頁時、載入圖片時、提交 HTML 表單時以及使用者按下某個鍵時。 在本文中,我們將簡化 DOM 事件中的關鍵概念並探討如何處理...
    程式設計 發佈於2024-11-08
  • 為什麼 PHP 中的「+」運算子不連接數組?
    為什麼 PHP 中的「+」運算子不連接數組?
    理解 PHP 中的陣列串聯嘗試使用 ' ' 運算子組合兩個陣列時,使用者可能會遇到意外結果。這就是為什麼以下程式碼沒有如預期連接陣列的原因:$array = array('Item 1'); $array = array('Item 2'); var_dump($array);此程...
    程式設計 發佈於2024-11-08
  • 為什麼 IE 日期建構函式與 Chrome 和 Firefox 日期處理不同?
    為什麼 IE 日期建構函式與 Chrome 和 Firefox 日期處理不同?
    IE 日期建構子問題:NaN 與其他瀏覽器中的功能在涉及JavaScript 日曆開發的專案中,日期處理中出現了差異Internet Explorer (IE) 以及Firefox 和Chrome 等瀏覽器。具體來說,IE 的日期函數產生 NaN(非數字)值,而它們在其他瀏覽器中正常運作。 經過調查...
    程式設計 發佈於2024-11-08
  • 如何使用正規表示式刪除 PHP 字串中的特定特殊字符,同時保留其他字符?
    如何使用正規表示式刪除 PHP 字串中的特定特殊字符,同時保留其他字符?
    PHP:從字串中刪除特殊字元在PHP 中,從字串中刪除特殊字元可能是一項常見任務,尤其是在處理用戶輸入或外部資料時。面臨的挑戰是刪除所有不需要的字符,而不改變標點符號或空格等基本字符。 為了解決這個問題,通常使用正規表示式。但是,當嘗試刪除特定特殊字元並保留其他特殊字元時,需要對表達式進行修改。 調...
    程式設計 發佈於2024-11-08
  • 如何保證PHP中不同平台的換行符一致?
    如何保證PHP中不同平台的換行符一致?
    使用PHP 在多個平台中回顯換行符在PHP 中回顯換行符時,字元\n 和\r起著至關重要的作用。它們分別代表換行符和回車符。兩者之間的差異在於作業系統相容性。 \n 與\r\n (換行符號) :在Linux 和macOS 等基於Unix 的系統中使用,標記行尾。 \r(Enter):在 Window...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3