主頁 > 軟體設計 > 程式員必須練就的「性能調優」組合拳【3】

程式員必須練就的「性能調優」組合拳【3】

2020-09-13 03:40:12 軟體設計

性能調優系列前序文章索引:

  • 程式員必須掌握的性能調優老兵哥結合個人經歷解釋了程式員往架構師方向發展時為什么要跨越性能調優這一關,以及介紹了從 X、Y、Z 三個維度優化性能的思路,
  • 從  X  維度優化系統的性能老兵哥分享了從 X 維度優化系統性能的思路,包括讓客戶端分計算存盤任務、優化互動設計等,主要是作為引子拓寬我們性能調優的思路,
  • 應用容器 Tomcat 性能調優Y 維度就是從業務 HTTP 請求的橫向處理流程來看,HTTP 請求會穿越網路、計算機、應用容器(Tomcat)、Spring、ORM(Hibernate)、資料庫等節點,在這個流程中每個節點都有許多可以可優化的地方,此文主要介紹通過優化應用容器(Tomcat)來優化系統性能的方法,

程式員在轉型架構師的程序中需要建立流程化、結構化、系統化的思維方式,而性能調優是非常難得的貧訓,它既給了我們壓力,也給了我們動力,跨越它就是突破自己的程序,

  • X 維度,即業務維度,技術始終是服務業務的,任何技術問題的原點就是業務需求,在啟動技術層面的性能優化之前,我們有必要先審視一下業務流程是否合理,互動設計上有沒有可以優化的空間等,
  • Y 維度,待業務維度優化完畢,接下來就是審視技術在實作當前業務流程或互動設計的全鏈路上有沒有可優化的地方,即 HTTP 請求處理全流程,從瀏覽器到應用容器,再到 Spring、Hibernate、資料庫等,
  • Z 維度,除了沿著 HTTP 請求的橫向鏈路,我們還要審視支持應用系統的縱向技術堆疊,從上到下包括 JVM、作業系統和硬體等,這是整套應用系統運行的環境,許多性能問題都跟運行環境存在關系,

今天老兵哥將介紹通過優化開發框架 Spring 來優化系統性能的方法,

3. 開發框架 Spring

3.1 事務管理

事務(Transaction),是并發控制的基本單位,是用戶定義的一個操作序列,這些操作要么都做,要么都不做,是一個不可分割的作業單位,通過使用事務控制,我們可以極大地避免邏輯處理失敗導致的臟資料等問題,事務具有 4 個屬性:原子性、一致性、隔離性、持久性等,這四個屬性通常稱為 ACID 特性,

  • 原子性(Atomicity),一個事務是一個不可分割的作業單位,事務包含的操作要么都做、要么都不做,
  • 一致性(Consistency),事務必須讓資料庫從一個一致性狀態變到另一個一致性狀態,不能出現不一致,
  • 隔離性(Isolation),一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的資料對并發的其他事務是隔離的,并發執行的各個事務之間不能互相干擾,
  • 持久性(Durability),持久性也稱永久性,指一個事務一旦提交,它對資料庫中資料的改變是永久性的,接下來的其他操作或故障不應該對其有任何影響,

Spring 事務管理是通過 XML 檔案或注解 @Transactional 配置的,其背后是靜態代理或動態代理等技術,在代理模式下,那些從代理傳遞傳過來的“外部”方法呼叫會被攔截,但“自我呼叫”是不會觸發事務的,例如,在目標物件中呼叫自身其他方法的方法是不會觸發事務的,即使被呼叫的方法標記為 @Transactional,

通常,我們很少關注 Spring 事務管理相關的屬性,但這些屬性的取值會影響系統的性能,Spring 事務管理最重要的兩個特性是:傳播級別、隔離級別,傳播級別,定義了事務的控制范圍;隔離級別,定義了事務在資料庫讀寫方面的控制范圍,我們知道,事務的控制范圍越大,系統的并發性就會越差,性能也就隨之降低,事務的隔離級別越高,系統的并發性也會越差,性能也會隨之下降,如果不了解這些屬性的取值規則,我們就不能選擇最合適的取值,不知不覺中就會浪費許多系統資源,接下來我們一起來看看這些屬性,

屬性型別描述
propagation 列舉型:Propagation 傳播級別,可選,默認值:PROPAGATION_REQUIRED
isolation 列舉型:Isolation 隔離級別,可選,默認值:ISOLATION_DEFAULT
readOnly 布爾型 讀寫型事務、只讀型事務
timeout INT 型,以秒為單位 事務超時閾值
rollbackFor 一組 Class 類,必須是 Throwable 的子類 一組例外類,遇到時必須回滾,默認情況下 Checked Exceptions 不進行回滾,僅 Unchecked Exceptions(即 RuntimeException 的子類)才進行事務回滾,
rollbackForClassname 一組 Class 類的名字,必須是 Throwable 的子類 一組例外類名,遇到時必須回滾
noRollbackFor 一組 Class 類,必須是 Throwable 的子類 一組例外類,遇到時不需要回滾

Spring 事務管理的傳播級別 Propagation 取值有以下幾種: 

傳播級別說明備注
PROPAGATION_REQUIRED 如果背景關系中已經存在事務,那么就加入到事務中執行;如果背景關系中不存在事務,則新建事務執行, 這個級別通常能滿足處理大多數的業務場景,
PROPAGATION_SUPPORTS 如果背景關系中已經存在事務,則支持加入到事務中執行;如果背景關系中不存在事務,則使用非事務的方式執行, 這個通常是用來處理那些并非原子性的非核心業務邏輯操作,應用場景較少,
PROPAGATION_MANDATORY 該級別的事務要求背景關系中必須要存在事務,否則就會拋出例外,這是避免背景關系呼叫代碼遺漏添加事務控制的保證手段, 例如某段代碼不能被單獨呼叫執行,但是一旦被呼叫就必須要有事務包含,這種情況下就可以使用這個傳播級別,
PROPAGATION_REQUIRES_NEW 每次都會新建一個事務,并且同時將背景關系中的事務掛起,執行當前新建事務完成以后,背景關系事務恢復再執行, 問題1:如果某個子事務發生回滾,父事務是否回滾?答案是不會,因為子事務是新建事務,父事務已經被掛起,兩者不會受到影響,問題2:如果父事務發生回滾,子事務是否回滾?答案是不會,同樣的理由,但是可以手動控制,一旦子事務回滾,父事務也回滾,
PROPAGATION_NOT_SUPPORTED 如果背景關系中已經存在事務,則掛起事務,執行當前邏輯,結束后恢復背景關系的事務, 這個級別可以幫助你盡可能地縮小事務范圍,一個事務范圍越大,它存在的風險也就越多,例如某段代碼是回圈 1000 次的非核心業務邏輯操作,此類代碼如果包在事務中,勢必導致事務太大,很容易出現些難以考慮周全的例外情況,此時這個級別就派上用場了,
PROPAGATION_NEVER 該級別要求背景關系中不能存在事務,一旦有事務,就拋出runtime例外,強制停止執行,

 傳播級別 PROPAGATION_REQUIRED 會為每一個被應用到的方法創建一個邏輯事務作用域,每一個邏輯事務作用域都可以自主地決定回滾條件,當這樣的邏輯事務作用域被外部邏輯事務作用域所包含時,它們在邏輯上是獨立的,但在實作層面它們會被映射到相同的物理事務上,

傳播級別 PROPAGATION_REQUIRES_NEW 為每一個相關的事務作用域使用了一個完全獨立的事務,在這種情況下,物理事務也將是不同的,因此,外部事務可以不受內部事務回滾狀態的影響獨立提交或者回滾,

Spring 事務管理的隔離級別 Isolation 取值有以下幾種:

隔離級別說明
Serializable 最嚴格的級別,事務串行執行,資源消耗最大,
Repeatable Read 保證了一個事務不會修改已經由另一個事務讀取但未提交(或回滾)的資料,避免了“臟讀取”和“不可重復讀取”的情況,但會帶來了更多的性能損耗,
Read Committed 大多數主流資料庫的默認事務等級,保證了一個事務不會讀到另一個并行事務已修改但未提交的資料,避免了“臟讀取”,該級別適用于大多數系統,
Read Uncommitted 保證了讀取程序中不會讀取到非法資料,

上述說明中涉及的幾個專業術語:

  • 臟讀(Dirty Reads):就是讀到了別的事務回滾前的臟資料,例如,事務 B 執行程序中修改了資料 X,在未提交前,事務 A 讀取了 X,而事務 B 卻回滾了,這樣事務 A 就形成了臟讀,
  • 不可重復讀(Non-Repeatable Reads):不可重復讀字面含義已經很明確了,例如,事務 A 首先讀取了一條資料,然后執行邏輯的時候,事務 B 將這條資料改變了,然后事務 A 再次讀取的時候,發現資料不匹配了,這就是所謂的不可重復讀,
  • 幻讀(Phantom Reads):我們小時候數鴨子,第一次數是 10 個,第二次數是 11 個,怎么回事,產生幻覺了?幻讀也是這樣子,事務 A 先根據條件索引到 10 條資料,然后事務 B 改變了資料庫一條資料,導致也符合事務 A 的搜索條件,這樣事務 A 再次搜索發現有 11 條資料了,這就產生了幻讀,
隔離級別與副作用臟讀不可重復讀幻讀
Serializable 不會 不會 不會
Repeatable Read 不會 不會
Read Committed 不會
Read Uncommitted

從上面這張映射表中,我們知道最安全的是 Serializable,但是伴隨而來的是高昂的性能開銷,各種傳播級別、隔離級別本身沒有好壞,關鍵是根據業務需求選擇最合適的取值,避免無效的性能損耗,另外,Spring 事務管理還有兩個常用屬性,它們的取值也會影響性能:

  • Readonly:只讀型事務要比讀寫型事務的性能更好,設定事務為只讀以提升性能,
  • Timeout:設定事務的超時時間,一般用于防止大事務的發生,事務要盡可能的小,

3.2 二級快取

快取作為提高應用系統性能的一種有效途徑,在事務管理配置不當的情況下,將很難發揮應有的效用,因此,在做快取處理或者其他處理,要考慮事務管理對性能的影響,

 

關注「 IT老兵哥 」,賦能程式人生!堅持原創不易,請小伙伴們不吝點個「  」哦!推薦軟技能文章,請點擊鏈接:程式員,怎樣打造個人影響力?

 

 

近期熱評系列《 程式員必須懂的架構師入門課 》:

  • 架構到底是什么,你知道嗎? (閱讀人數:1201)
  • 架構都有哪些,我該怎么選? (閱讀人數:886)
  • 架構師都干什么,你知道嗎? (閱讀人數:1178)
  • 練就哪些技能才勝任架構師? (閱讀人數:1145)
  • 怎樣才能搞定上下游的客戶? (閱讀人數:492)
  • 如何從開發崗轉型做架構師? (閱讀人數:1288)
  • 程式員必須懂的架構入門課    (閱讀人數:611)

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/19539.html

標籤:架構設計

上一篇:程式員必須練就的「性能調優」組合拳【2】

下一篇:實戰_Spring_Cloud

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more