讀Java性能權威指南(第2版)筆記06_資料庫性能JPA&SpringData

来源:https://www.cnblogs.com/lying7/archive/2023/03/02/17165648.html
-Advertisement-
Play Games

1. JPA 1.1. 性能直接受底層JDBC驅動性能的影響 1.2. 性能提升是通過改變實體類的位元組碼來實現的 1.2.1. 在類載入到JAR文件或者由JVM運行之前增強位元組碼的方法 1.2.1.1. 在編譯過程中完成的 1.2.1.2. 在實體類編譯完成後,它們會被傳遞給一個特定實現的後置處理器 ...


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的其他功能


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 好家伙,本篇為《JS高級程式設計》第十章“期約與非同步函數”學習筆記 1.非同步編程 同步行為和非同步行為的對立統一是電腦科學的一個基本概念。 特別是在 JavaScript 這種單線程事 件迴圈模型中,同步操作與非同步操作更是代碼所要依賴的核心機制。 非同步行為是為了優化因計算量大而 時間長的操作。如果在 ...
  • 繪製一個點 我們初步認識了 webgl,本篇主要圍繞繪製一個點的示例,逐步實現下麵功能: 點的位置從 js 傳入著色器 點的大小由 js 傳入著色器 通過滑鼠點擊繪點 通過滑鼠點擊繪點,並改變點的顏色 繪製一個點(版本2) 需求 在上篇中我們在canvas中心繪製了一個點(效果如下),但這點的位置是 ...
  • 情況說明: onKeydown事件觸發條件:容器中某個元素獲取焦點時,按鍵。因此無效的原因是當前容器內並沒有元素獲取焦點。 方案一:容器中監聽快捷鍵 解決方案:利用全局監聽 window.onKeydown document.onkeydown 方案二:視窗中多個容器,監聽各自的快捷鍵 與“方案一” ...
  • 一、https://element-plus.gitee.io/zh-CN/ 官網 二、後臺佈局Layui 代碼示例如下 <template> <div class="app_container"> <div class="common-layout"> <el-container> <el-asi ...
  • 在vue中父子組件傳值是必不可少的,大家必須要學會! 首先父組件向子組件傳值: 父組件:比如我們傳teacher為index,如果我們傳值變數可以使用 : 綁定我們在data中定義的變數。 子組件:為了規範一般使用對象的形式,type表示值的類型,default表示如果不傳值就預設是null. 在子 ...
  • 環境 vue2 導入 安裝npm包 echarts echarts-gl import * as echarts from "echarts" import "echarts-gl" html <div id="map-container"></div> js import GeoZJ from ' ...
  • RxEditor是一款開源企業級可視化低代碼前端,目標是可以編輯所有 HTML 基礎的組件。比如支持 React、VUE、小程式等,目前僅實現了 React 版。 RxEditor運行快照: 項目地址:https://github.com/rxdrag/rxeditor 演示地址( Vercel 部 ...
  • 如何畫好一張架構圖,要做好這件事情首先要回答的就是什麼是架構圖。我們日常工作中經常能看到各種各樣的架構圖,而且經常會發現大家對架構圖的理解各有側重。深入追究到這個問題,可能一下子還很難有一個具象的定義,如果我們把這個問題進行拆分,理解起來就會容易一點。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...