欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL預(yù)編譯語句過多告警排查及解決方案

 更新時間:2025年01月26日 10:18:19   作者:MrCao杰羅爾德  
在使用Spring Cloud Alibaba搭建的微服務(wù)架構(gòu)中,項(xiàng)目采用ShardingSphere進(jìn)行分庫分表,MyBatis-Plus作為持久層,線上環(huán)境突發(fā)大量預(yù)編譯語句過多的數(shù)據(jù)庫告警,導(dǎo)致系統(tǒng)性能下降,所以本文給大家介紹了MySQL預(yù)編譯語句過多告警排查及解決方案,需要的朋友可以參考下

業(yè)務(wù)背景

在使用Spring Cloud Alibaba搭建的微服務(wù)架構(gòu)中,項(xiàng)目采用ShardingSphere進(jìn)行分庫分表,MyBatis-Plus作為持久層。線上環(huán)境突發(fā)大量預(yù)編譯語句過多的數(shù)據(jù)庫告警,導(dǎo)致系統(tǒng)性能下降。

排查過程

1. 初步排查:聯(lián)系云數(shù)據(jù)庫廠商

首先,聯(lián)系云數(shù)據(jù)庫服務(wù)廠商協(xié)助排查,確認(rèn)問題是由于預(yù)編譯緩存未被釋放,導(dǎo)致占用過多數(shù)據(jù)庫資源。

2. 排查連接池配置

懷疑問題與連接池有關(guān),特別是考慮到線上負(fù)載較高的高峰時段。經(jīng)過檢查,項(xiàng)目使用的是HikariCP連接池,相關(guān)配置如下:

特別關(guān)注兩個參數(shù):

  • maxLifetime: 連接池最大生命周期
  • idleTimeout: 連接池空閑超時時間

在進(jìn)行斷點(diǎn)調(diào)試后,由于項(xiàng)目使用了Sharding-JDBC,某些參數(shù)并未按照Hikari的默認(rèn)值生效,而是被Sharding進(jìn)行初始化配置。Sharding的相關(guān)代碼如下:

此時可以初步排除連接池配置問題,因?yàn)镾harding已將idleTimeout配置為60秒。

3. 分析HikariCP源碼與Statement Cache問題

深入分析HikariCP源碼,查找與PreparedStatement緩存相關(guān)的內(nèi)容,發(fā)現(xiàn)README.md關(guān)鍵描述:

Statement Cache

HikariCP與其他連接池(如Apache DBCP、Vibur、c3p0等)在處理PreparedStatement緩存時的區(qū)別:

  • HikariCP: 不提供PreparedStatement緩存,原因是連接池層級緩存PreparedStatement只能按連接緩存,導(dǎo)致內(nèi)存占用過大。
  • 其他連接池: 許多連接池提供PreparedStatement緩存,但這會導(dǎo)致大量PreparedStatement對象及相關(guān)執(zhí)行計(jì)劃在內(nèi)存中存儲,影響性能。

HikariCP并不緩存PreparedStatement,因?yàn)槎鄶?shù)數(shù)據(jù)庫JDBC驅(qū)動已經(jīng)內(nèi)置緩存機(jī)制,可以跨連接共享執(zhí)行計(jì)劃,避免重復(fù)占用內(nèi)存。

要點(diǎn):

  • 連接池層級的PreparedStatement緩存問題:在連接池層緩存會導(dǎo)致大量內(nèi)存占用,且不支持跨連接共享。
  • 數(shù)據(jù)庫驅(qū)動緩存的優(yōu)勢:數(shù)據(jù)庫驅(qū)動層提供的緩存更高效,能夠共享執(zhí)行計(jì)劃,減少內(nèi)存占用。
  • 反模式:在連接池層進(jìn)行緩存PreparedStatement是性能反模式。

4. MySQL驅(qū)動配置分析

進(jìn)一步排查MySQL驅(qū)動,發(fā)現(xiàn)項(xiàng)目使用的mysql-connector-j:8.3.0驅(qū)動,關(guān)鍵配置useServerPrepStmts默認(rèn)為true,即開啟服務(wù)端的預(yù)編譯緩存。而在同一項(xiàng)目中,其他服務(wù)使用的是mysql-connector-java:8.0.16,該版本的默認(rèn)配置為false。

核心代碼:

通過對比,確認(rèn)開啟服務(wù)端預(yù)編譯緩存是導(dǎo)致告警的根本原因。

解決方案

通過排查,最終確定問題原因是服務(wù)端的預(yù)編譯緩存未關(guān)閉。由于項(xiàng)目采用分庫分表,并且在同一數(shù)據(jù)庫實(shí)例中創(chuàng)建了多個Schema,默認(rèn)開啟的服務(wù)端預(yù)編譯緩存容易導(dǎo)致資源占用過高。

解決步驟:

在JDBC連接字符串中添加配置&useServerPrepStmts=false,關(guān)閉MySQL的服務(wù)端預(yù)編譯緩存。

例如,JDBC連接URL修改如下:

jdbc:mysql://localhost:3306/dbname?useServerPrepStmts=false

配置完成后,重新啟動服務(wù),觀察效果。關(guān)閉服務(wù)端預(yù)編譯緩存后,數(shù)據(jù)庫告警明顯減少,系統(tǒng)性能得到提升。

總結(jié)

通過排查,我們確認(rèn)了預(yù)編譯語句過多告警的根本原因是MySQL服務(wù)端開啟了預(yù)編譯緩存,導(dǎo)致過多的執(zhí)行計(jì)劃占用資源。解決方案是關(guān)閉服務(wù)端的PreparedStatement緩存,減少系統(tǒng)負(fù)載并提升性能。

到此這篇關(guān)于MySQL預(yù)編譯語句過多告警排查及解決方案的文章就介紹到這了,更多相關(guān)MySQL預(yù)編譯語句過多告警內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 聊聊MySQL中的參數(shù)

    聊聊MySQL中的參數(shù)

    這篇文章主要介紹了MySQL中的參數(shù)是什么,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • Mysql無法選取非聚合列的解決方法

    Mysql無法選取非聚合列的解決方法

    這篇文章主要給大家介紹了關(guān)于Mysql無法選取非聚合列的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • phpstudy安裝后mysql無法啟動的解決

    phpstudy安裝后mysql無法啟動的解決

    本文主要介紹了phpstudy安裝后mysql無法啟動的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • MySql增加用戶、授權(quán)、修改密碼等語句

    MySql增加用戶、授權(quán)、修改密碼等語句

    MySql 新建用戶,新建數(shù)據(jù)庫,用戶授權(quán),刪除用戶,修改密碼
    2008-09-09
  • 關(guān)于MySQL中“Insert into select“ 的死鎖情況分析

    關(guān)于MySQL中“Insert into select“ 的死鎖情況分析

    這篇文章主要介紹了關(guān)于MySQL中“Insert into select“ 的死鎖情況分析,死鎖是指兩個或者多個事務(wù)在同一資源上的相互占用,并請求鎖定對方占用的資源,從而導(dǎo)致惡性循環(huán)的現(xiàn)象,需要的朋友可以參考下
    2023-05-05
  • MySQL刪除數(shù)據(jù)庫的兩種方法

    MySQL刪除數(shù)據(jù)庫的兩種方法

    這篇文章主要為大家詳細(xì)介紹了MySQL刪除數(shù)據(jù)庫的兩種方法,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Mysql select in 按id排序?qū)崿F(xiàn)方法

    Mysql select in 按id排序?qū)崿F(xiàn)方法

    有時候我們在后臺選擇了一系列的id,我們想安裝填寫id的順序進(jìn)行排序,那么就需要下面的order by方法,測試通過
    2013-03-03
  • mysql免安裝版配置步驟詳解分享

    mysql免安裝版配置步驟詳解分享

    這篇文章主要介紹了mysql免安裝版配置步驟詳解,提供了二個網(wǎng)友的安裝方法,大家可以參考使用
    2013-12-12
  • Mysql索引結(jié)合explain分析示例

    Mysql索引結(jié)合explain分析示例

    本文主要介紹了Mysql索引結(jié)合explain分析示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 查看修改MySQL表結(jié)構(gòu)命令

    查看修改MySQL表結(jié)構(gòu)命令

    這篇文章主要介紹了查看修改MySQL表結(jié)構(gòu)命令,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論