精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL 連接怎么保活?

數據庫 MySQL
MySQL 系統變量 wait_timeout,默認值是 28800 秒(8 小時),用于控制客戶端多長時間沒有給 MySQL 發送請求,MySQL 就自動斷開連接。

多年前開發過一個異步發送訂單短信、郵件通知的??守護??程序,每次程序啟動時會創建數據庫連接,后續讀寫數據庫操作就一直復用這個連接。

某一天,用戶反饋下單后收不到通知了,我們登錄服務器看到程序還在運行。

經過排查確認,發生問題的這天,距離上一次有用戶下單超過了 8 小時,MySQL 服務端已經自動斷開連接了。

解決這個問題的辦法比較簡單,程序只要定期給 MySQL 發送請求,表示自己還活著,MySQL 就不會觸發斷開連接的操作了,這就是數據庫連接保活的應用場景。

今天我們來聊聊數據庫連接保活的原理和方式。

本文內容基于 MySQL 8.0.29 源碼。

正文

1、概述

MySQL 系統變量 wait_timeout,默認值是 28800 秒(8 小時),用于控制客戶端多長時間沒有給 MySQL 發送請求,MySQL 就自動斷開連接。

如果我們的業務系統不那么閑,能隔三差五的給 MySQL 發送一些請求,數據庫連接會一直處于活躍狀態,也就不需要專門保活了。

有一些業務系統,低峰期可能很長時間都不會有讀寫請求,一旦間隔時間超過 wait_timeout,數據庫連接就斷開了,連接保活自然不可避免。

接下來我們聊聊 2 種連接保活方式,以及它們之間有什么不一樣,在這之前,我們先來看看 wait_timeout 是怎么控制超時邏輯的。

2、 wait_timeout 超時邏輯

客戶端和 MySQL 建立連接之后,MySQL 每次開始等待客戶端發送數據之前,都會根據系統變量 ??wait_timeout?? 的值設置最長等待時間:

bool do_command(THD *thd){
……
net = thd->get_protocol_classic()->get_net();
my_net_set_read_timeout(net, thd->variables.net_wait_timeout);
……
}

上面代碼中的 net_wait_timeout 就是系統變量 wait_timeout 的化身。

設置最長等待時間之后,接下來就是安靜的等待了,執行等待操作的方法是 vio_io_wait():

int vio_socket_io_wait(Vio *vio, enum enum_vio_io_event event){
int timeout, ret;
……
timeout = vio->read_timeout;
……
switch (vio_io_wait(vio, event, timeout)) {
……
case 0:
/* The wait timed out. */
ret = -1;
break;
……
}

return ret;
}

如果達到了最長等待時間,客戶端一直沒有發送數據,vio_io_wait() 會返 0 表示超時。

然后,程序會沿著調用棧一路返回到 net_read_raw_loop() 方法中,設置返回給客戶端的錯誤碼 ER_CLIENT_INTERACTION_TIMEOUT(4031),對應的錯誤信息為:

The client was disconnected by the server because of inactivity.
See wait_timeout and interactive_timeout for configuring this behavior.

準備好返回給客戶端的錯誤碼和錯誤信息之后,就會進行一系列斷開連接相關的操作,最后把錯誤碼和錯誤信息發送給客戶端。

如果我們用的是 MySQL 自帶的交互式客戶端 mysql,發生超時之后,等下次再執行 SQL 語句時,就會看到這樣的錯誤了:

mysql> SET wait_timeout = 10;
10 秒之后......
mysql> SELECT * FROM t1 LIMIT 1;
ERROR 4031 (HY000): The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.
No connection. Trying to reconnect...

對 MySQL 服務端主動斷開連接過程大概介紹之后,接下來看看 2 種連接保活方式。

3、ping

站在客戶端的視角看,使用 ping 命令是為了判斷 MySQL 服務端是否還活著。

換一個角度,在 MySQL 服務端看來,一個客戶端給它發送了 ping 命令,說明這個客戶端連接還活著,它就不會把這個客戶端的連接關閉。

所以,ping 命令不但可以用于數據庫連接探活,還可以用于保活。

MySQL 沒有提供 ping 語句,如果想測試發送 ping 命令,可以使用 mysqladmin:

# 發送 ping 命令
mysqladmin -h127.0.0.1 -P 3307 -uroot ping
# 收到的結果(表示 MySQL 服務端還活著)
mysqld is alive

在數據庫連接池或者業務系統中,通過程序提供的 API 也能很方便地發送 ping 命令給 MySQL 服務端。

在業務低峰期,客戶端定時給 MySQL 服務端發送 ping 命令,就能給連接保活了。

4、select

另一種連接保活方式是執行 SQL 語句,一般都是 select 語句,可以有各種花樣:

SELECT 1;
SELECT version();
SELECT @@version;
……

執行 select 語句保活,和正常執行業務 SQL 沒什么區別,這里不展開了。

5、兩種保活方式對比

既然 ping 和 select 都能實現數據庫連接保活,那它們之間有什么不一樣?

在MySQL 源碼的實現中,體現了 2 點區別:

區別 1:ping 是命令,我們只能通過 MySQL 提供的 API,或 mysqladmin 這樣的工具發送 ping 命令給 MySQL 服務端。

select 是 SQL 語句,通過 MySQL API 或 mysql 交互式客戶端都能執行 select 語句。

區別 2:ping 的執行流程比 select 更短,效率更高,通過對比兩者的調用棧,我們能更直觀的看到這一點。

兩種方式都會響應客戶端請求,后面給出的調用棧中,把這部分省略了。

ping 命令的主要調用棧如下:

| > pfs_spawn_thread(void*)
| | > handle_connection(void*)
| | | > do_command(THD*)
| | | | > dispatch_command(THD*, COM_DATA const*, enum_server_command)

ping 命令的調用棧很簡單,連詞法解析、語法解析過程都不需要,進入 dispatch_command() 方法之后,判斷是 ping 命令,就直接給客戶端返回 OK 狀態,整個流程就結束了:

bool dispatch_command(THD *thd, const COM_DATA *com_data,
enum enum_server_command command){
......
switch (command) {
......
case COM_PING:
thd->status_var.com_other++;
my_ok(thd); // Tell client we are alive
break;
......
}
......
}

接下來是 select 的調用棧,以最簡單的 SELECT 1 為例,主要調用棧如下:

SELECT 1 的調用棧比較長,把主要調用棧都列出來是為了大家對 SELECT 1 的執行過程有更直觀的了解。

| > pfs_spawn_thread(void*)
| | > handle_connection(void*)
| | | > do_command(THD*)
| | | | > dispatch_command(THD*, COM_DATA const*, enum_server_command)
| | | | | > dispatch_sql_command(THD*, Parser_state*)
| | | | | | > parse_sql(THD*, Parser_state*, Object_creation_ctx*)
| | | | | | > mysql_execute_command(THD*, bool)
| | | | | | | > Sql_cmd_dml::execute(THD*)
| | | | | | | | > Sql_cmd_dml::prepare(THD*)
| | | | | | | | | > open_tables_for_query(THD*, TABLE_LIST*, unsigned int)
| | | | | | | | | | > open_tables(...)
| | | | | | | | | | | > lock_table_names(...)
| | | | | | | | | | > open_secondary_engine_tables(THD*, unsigned int)
| | | | | | | | | > Sql_cmd_select::prepare_inner(THD*)
| | | | | | | | | | > Query_block::prepare(THD*, mem_root_deque<Item* > *)
| | | | | | | | | | | > Query_block::setup_tables(THD*, TABLE_LIST*, bool)
| | | | | | | | | | | > setup_fields(...)
| | | | | | | | | | | > Query_block::setup_conds(THD*)
| | | | | | | | | | | > Query_block::resolve_limits(THD*)
| | | | | | | | | | | > Query_block::apply_local_transforms(THD*, bool)
| | | | | | | | | | | | > Query_block::simplify_joins(...)
| | | | | | | | > lock_tables(THD*, TABLE_LIST*, unsigned int, unsigned int)
| | | | | | | | > Sql_cmd_dml::execute_inner(THD*)
| | | | | | | | | > Query_expression::optimize(THD*, TABLE*, bool, bool)
| | | | | | | | | | > Query_block::optimize(THD*, bool)
| | | | | | | | | | | > JOIN::optimize(bool)
| | | | | | | | | | | | > JOIN::make_tmp_tables_info()
| | | | | | | | | | | | > count_field_types(...)
| | | | | | | | | | | | > JOIN::create_access_paths()
| | | | | | | | | | | | | > JOIN::create_root_access_path_for_join()
| | | | | | | | | | | | | > JOIN::attach_access_paths_for_having_and_limit(AccessPath*)
| | | | | | | | | | | | | > JOIN::attach_access_path_for_delete(AccessPath*)
| | | | | | | | | > optimize_secondary_engine(THD*)
| | | | | | | | | > Query_expression::execute(THD*)
| | | | | | | | | | > Query_expression::ExecuteIteratorQuery(THD*)
| | | | | | | | | | | > Query_result_send::send_result_set_metadata(...)
| | | | | | | | | | > Query_expression::ExecuteIteratorQuery(THD*)
| | | | | | | | | | | > FakeSingleRowIterator::Read()
| | | | | | | | | | | > Query_result_send::send_eof(THD*)
| | | | | | | > trans_commit_stmt(THD*, bool)
| | | | | | | | > MYSQL_BIN_LOG::commit(THD*, bool)
| | | | | | | | | > ha_commit_low(THD*, bool, bool)
| | | | | > log_slow_statement(THD*, System_status_var*)

從上面的調用棧可以看到,SELECT 1 雖然不需要從表里查詢數據,但是詞法解析、語法解析、查詢準備、查詢優化、查詢執行、事務提交、記錄慢 SQL 等等這些流程一個都沒落下,雖然很多方法進去之后,并不需要執行復雜的操作,但是各種 if ... else 判斷是少不了要執行的。

SELECT 1 是 select 語句最簡單的形式了,如果用其它 select 語句保活,調用棧只會更長。

通過上面 ping 命令 和 SELECT 1 的調用棧對比,相信大家對這兩種保活方式的執行效率已經有了直觀的了解。

6. 總結

本文寫作的初衷就是為了對比 ping 和 select 兩種數據庫連接保活方式的執行效率。

經過前面的介紹,我們就可以得出結論了:
ping 命令的執行效率比 select 語句高,對于追求極致性能的應用來說,使用 ping 命令給數據庫連接保活是更好的方式。

本文轉載自微信公眾號「一樹一溪」,可以通過以下二維碼關注。轉載本文請聯系一樹一溪公眾號。

責任編輯:姜華 來源: 一樹一溪
相關推薦

2019-09-23 08:27:15

TCP長連接心跳

2020-03-19 10:13:13

OkHttpWebSocket

2020-02-25 16:48:35

AndroidGoogle 移動系統

2023-01-26 23:44:41

C++代碼生命周期

2024-10-11 16:57:18

2019-12-31 09:11:01

后臺Android系統

2012-09-27 09:23:34

Google

2016-08-11 09:19:36

AndroidService通訊應用

2013-11-06 10:35:34

2019-03-18 10:32:33

容災雙活同城

2025-02-07 10:34:26

JAVA程序Java 9

2015-07-28 10:35:02

編程程序員加班

2015-07-28 09:17:47

健康編程

2020-02-12 11:34:56

架構平滑上云機房遷移

2017-09-11 19:30:44

MySQLCmd命令連接數據庫

2024-08-12 08:04:00

2019-10-08 13:21:15

MySQL連接數數據庫

2020-10-09 18:37:53

等保測評師等保2.0網絡安全

2013-07-29 10:10:40

TCP協議TCP定時器TCP

2015-10-15 09:38:48

TCP網絡協議定時器
點贊
收藏

51CTO技術棧公眾號

中文字幕在线高清| 无码精品黑人一区二区三区| 99re久久最新地址获取| 69p69国产精品| 99久久久精品视频| 深夜福利在线看| 日韩成人午夜精品| 免费99精品国产自在在线| 日本美女视频网站| 性欧美freehd18| 亚洲综合久久久| 日本三级中国三级99人妇网站| 在线视频 91| 精品91久久久久| 中国人与牲禽动交精品| 免费黄视频在线观看| 性欧美hd调教| 一区二区三区国产精品| 奇米888一区二区三区| www.亚洲欧美| 青椒成人免费视频| 午夜精品一区二区三区在线| 中文字幕美女视频| 亚洲激情77| 精品少妇一区二区三区在线视频| 日本熟妇人妻中出| 97久久人人超碰caoprom| 最近日韩中文字幕| 欧美一级二级三级| 亚洲av成人精品一区二区三区在线播放| 乱一区二区av| 日韩美女免费线视频| 精品在线视频免费| 欧美 日韩 国产 一区| 揄拍成人国产精品视频| 日韩网站在线播放| 久久aimee| 精品国产露脸精彩对白| 久久综合在线观看| 国产91亚洲精品久久久| 色www精品视频在线观看| 精品少妇在线视频| 啪啪免费视频一区| 亚洲乱码国产乱码精品精98午夜| 日韩欧美99| 免费在线视频一级不卡| 99re热这里只有精品视频| 国产精品久久久对白| 精品欧美一区二区精品少妇| 韩国成人在线视频| 91久久久国产精品| 91在线精品入口| 久草中文综合在线| 成人春色激情网| 国产又黄又大又爽| 精东粉嫩av免费一区二区三区 | 不卡视频观看| 亚洲一区在线观看免费 | 国产欧美日本| 57pao国产成人免费| 精品91久久久| 国产欧美亚洲一区| 日本一区二区三区在线播放| 97免费在线观看视频| 99热在线精品观看| 欧美在线视频免费观看| 日本中文字幕久久| 免费久久99精品国产| 国产欧美一区二区三区久久| 国产精品国产av| 国产精品一色哟哟哟| 99国产在线| 国产 日韩 欧美 综合| av成人动漫在线观看| 久久精品国产理论片免费| 青青免费在线视频| 久久精品网站免费观看| 一区二区三区四区| 啪啪免费视频一区| 欧美日韩视频免费播放| 亚洲黄色av网址| 国产精品99久久免费| 精品欧美一区二区在线观看| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 最新不卡av在线| 国产精品www在线观看| 日本三级一区| 欧美猛男gaygay网站| 国产精品无码自拍| 国产精品中文字幕亚洲欧美| 日韩网站在线观看| 亚欧洲精品在线视频| 日韩精品亚洲专区| 3d动漫啪啪精品一区二区免费| 欧美一级免费片| 中文字幕欧美激情一区| 肉大捧一出免费观看网站在线播放| 国产乱码精品一区二三赶尸艳谈| 91成人免费电影| 久久发布国产伦子伦精品| 美女久久99| 欧美另类第一页| 岛国av中文字幕| 国产主播一区二区三区| 久久99精品久久久久久青青日本| 91精品国产91久久久久游泳池| 亚洲综合视频在线观看| 成人在线免费播放视频| 91综合久久爱com| 中文字幕在线精品| 欧美a∨亚洲欧美亚洲| 极品少妇一区二区| 免费国产一区二区| 欧美人与性动交α欧美精品济南到 | 日韩电影大片中文字幕| 日本高清不卡免费| 玖玖在线精品| 成人91视频| 欧美午夜电影一区二区三区| 欧美日韩久久久久| 91成人在线观看喷潮蘑菇| 精品视频97| 欧美在线视频导航| 黄色a在线观看| 亚洲人成亚洲人成在线观看图片| 青青青国产在线视频| 99这里只有精品视频| 中文字幕亚洲激情| 国产伦精品一区二区三区视频网站| 国产99精品国产| 蜜桃视频成人在线观看| 伦一区二区三区中文字幕v亚洲| 日韩精品欧美国产精品忘忧草| 精国产品一区二区三区a片| 麻豆免费精品视频| 天堂一区二区三区| 欧美电影网址| 亚洲欧美在线看| 影音先锋在线国产| 99久久国产综合色|国产精品| 免费看日本黄色| 欧美大片91| 操日韩av在线电影| 99久久精品国产色欲| 日韩一区日韩二区| 亚洲一区二区福利视频| 国产精品毛片一区二区在线看| 国产精品黄色av| 国产在线视频网站| 欧美亚洲综合在线| 永久免费av无码网站性色av| 久久男女视频| 日韩中文不卡| www.精品国产| 色噜噜国产精品视频一区二区| 久久精品偷拍视频| 久久精品水蜜桃av综合天堂| 久草福利视频在线| 精品日韩在线| 成人午夜激情免费视频| a视频在线播放| 精品久久一区二区| 日韩久久精品视频| 91香蕉视频黄| 亚洲精品高清无码视频| 日韩久久电影| 成人午夜在线影院| 日韩经典av| 亚洲成人性视频| 国产精品6666| 久久久久久久网| 国产成人黄色网址| 亚洲女同一区| 国产伦精品一区二区三| 亚洲妇女成熟| 中文字幕在线亚洲| www.黄色av| 精品久久久中文| 黄色片网站免费| 久久99国产精品久久99 | 在线亚洲观看| 视频一区视频二区视频| 欧美国产亚洲精品| 8x海外华人永久免费日韩内陆视频| 精品美女视频在线观看免费软件 | 57pao成人国产永久免费| 黄色大片在线看| 7777精品伊人久久久大香线蕉超级流畅 | 国产精品家庭影院| 手机免费看av片| 日本欧美大码aⅴ在线播放| 亚洲欧美日韩不卡| 日韩精品亚洲aⅴ在线影院| 国产精品入口免费视频一| 亚洲综合伊人久久大杳蕉| 亚洲理论在线a中文字幕| 国产又爽又黄免费软件| 亚洲不卡av一区二区三区| 粉嫩精品久久99综合一区| 懂色av中文一区二区三区| 天堂av在线网站| 亚洲一级黄色| 亚洲在线视频一区二区| 欧美一级全黄| 成人黄色免费片| 欧美日韩视频网站| 欧美黄色片视频| 在线观看黄av| 国产视频亚洲视频| 亚洲成熟女性毛茸茸| 欧洲一区在线电影| 日本污视频在线观看| 亚洲欧美在线aaa| 中国美女乱淫免费看视频| 国产乱对白刺激视频不卡| 日本www高清视频| 亚洲激情精品| 看全色黄大色大片| 第一社区sis001原创亚洲| 狠狠色伊人亚洲综合网站色| 九九99久久精品在免费线bt| 国产精品日韩在线播放| 日韩欧美精品一区二区三区| 欧美国产亚洲精品久久久8v| 男人的天堂在线视频免费观看 | 一女三黑人理论片在线| 国产精品一区二区男女羞羞无遮挡| 国产真人无码作爱视频免费| av成人毛片| www.av91| 欧美 亚欧 日韩视频在线| 在线视频91| 欧美日韩一二三四| 欧美另类一区| 亚洲第一福利社区| 久久久久网址| 全国精品免费看| 国产一级二级三级精品| 一区二区三区四区高清视频 | 亚洲欧洲韩国日本视频| 极品蜜桃臀肥臀-x88av| 国产婷婷色一区二区三区| xxx在线播放| 国产亚洲综合色| 白白色免费视频| www激情久久| 91中文字幕永久在线| 久久这里只有精品6| 黑人巨大精品欧美| 久久久精品影视| 丰满的亚洲女人毛茸茸| 欧美韩国日本不卡| 日韩av毛片在线观看| 国产精品视频第一区| 欧美色图17p| 国产精品美女久久久久久久| 激情无码人妻又粗又大| 国产精品不卡视频| 久久中文免费视频| 亚洲香肠在线观看| 国产午夜福利片| 欧美日韩在线免费| 久久亚洲精品石原莉奈| 欧美无人高清视频在线观看| 久久这里只有精品9| 欧美丰满少妇xxxbbb| 99热这里只有精| 精品国产乱码久久久久久牛牛| 男人天堂网在线视频| 日韩av在线一区二区| 国产日产精品久久久久久婷婷| 中文字幕亚洲情99在线| av中文字幕在线播放| 久久久久久久香蕉网| sese综合| 91精品视频网站| 久久99精品国产自在现线| 欧美一区二区三区四区五区六区| 日韩综合在线| www.国产在线视频| 久久久久国产一区二区| 手机精品视频在线| 99re热这里只有精品视频| 欧美乱大交做爰xxxⅹ小说| 一区二区三区在线播| av图片在线观看| 欧美日韩国产乱码电影| 日本精品999| 尤物精品国产第一福利三区| 欧美巨大xxxx做受沙滩| 日本aⅴ大伊香蕉精品视频| 久久久精品区| 欧美精品在线一区| 欧美精品大片| www.亚洲天堂网| 国产在线精品一区二区不卡了 | 91成人国产综合久久精品| 日韩美女一区二区三区| 国产尤物视频在线| 久久久久久久久久久久久久久久久久av | 精品国产一区二区三区久久久蜜臀| 国产系列第一页| 久久精品国语| 日韩精品xxx| 中文字幕精品三区| 国产无码精品久久久| 欧美久久久久久久久| 婷婷国产在线| 美乳少妇欧美精品| 99久久综合国产精品二区| 国产乱码一区| 亚洲成人精品| 亚洲成人av免费看| www.亚洲激情.com| 国产波霸爆乳一区二区| 欧美在线观看18| 日韩一区av| 久久久久久久久久久成人| 韩国三级大全久久网站| 日韩三级在线播放| 香蕉久久a毛片| 黄色激情在线观看| 亚洲精品精品亚洲| 91福利免费视频| 在线观看不卡av| 视频在线日韩| 免费国产在线精品一区二区三区| 欧美日韩专区| 日本少妇激三级做爰在线| 国产精品丝袜在线| 波多野结衣视频网址| 精品亚洲精品福利线在观看| 免费看电影在线| 99精品国产高清在线观看| 亚洲九九视频| 第四色婷婷基地| 亚洲国产成人自拍| 糖心vlog精品一区二区| 亚洲视频欧美视频| 久久久一本精品| 日本不卡在线播放| 免费在线播放第一区高清av| 亚洲av无码一区二区三区网址| 亚洲va中文字幕| 人妻少妇一区二区三区| 午夜精品久久久久久久白皮肤| 澳门成人av| 国产成人无码精品久久久性色| 成人精品小蝌蚪| 日韩特黄一级片| 亚洲精品福利免费在线观看| 国产剧情av在线播放| 精品一区二区三区视频日产| 国产免费成人| 91视频在线网站| 欧美亚洲国产一区二区三区| 成人高清网站| 成人xxxxx| 国产精品mm| www.超碰97| 精品视频在线免费| 精品黄色免费中文电影在线播放 | 香蕉久久99| 国产精品天天av精麻传媒| 国产精品美女久久久久aⅴ | 国产一区二区调教| 久久中文字幕在线观看| 亚洲精品久久7777777| 欧美性suv| 性欧美18一19内谢| 成人免费视频国产在线观看| 日产精品久久久| 日韩中文字幕网址| 51精品国产| 国产a级片免费观看| 中文字幕亚洲一区二区av在线| av无码精品一区二区三区宅噜噜| 97久久精品视频| 精品视频久久| 熟妇女人妻丰满少妇中文字幕| 精品国产老师黑色丝袜高跟鞋| 精品视频二区| 99精品欧美一区二区三区| 国产亚洲在线| 国精产品一区一区| 亚洲第一av在线| 成人在线黄色| 97久久国产亚洲精品超碰热| 久久婷婷久久一区二区三区| 一区二区三区免费观看视频| 欧美激情视频一区| 精品国产91久久久久久浪潮蜜月| 色呦色呦色精品| 午夜av区久久| 老司机在线永久免费观看| 精品国产一区二区三区久久久久久| 日本vs亚洲vs韩国一区三区| 国产精品日日夜夜| 日韩小视频在线观看| 欧美一级三级|