常見的生產應用中我們一般都是用數據庫連接池來做MySQL連接管理,因為它非常方便,不需要我們手動處理連接,只需要在使用的時候取出一個連接,使用完成之后自動被連接池托管。那我們取出一個連接直接使用的時候,連接池如何做到連接保活的?
那為了解決這個問題,一般都是采用心跳的方式,常見的有以下兩種:
1.ping模式
作為客戶端,如果想保持自己的連接一直活著,那么就發送ping命令,這樣MySQL服務端收到這個命令之后回復:mysqld is alive
就代表MySQL服務端是存活的,同時對于MySQL來說它接收到了客戶端的ping命令,那就代表客戶端還活著,此時MySQL就不應該斷開這個連接。
2.select模式
常見的有以下兩種:
select 1;
select version();
這種方式的好處就是像執行SQL語句那樣執行,非常方便。
3. 區別
ping模式
和select模式
到底有什么區別呢?
-
ping模式
不會進行復雜的詞法分析,語法分析等,直接快速進行命令響應處理。select模式
會經過一系列mysql sql執行的步驟,最后還得執行慢查詢,事務提交等,這個過程下來耗費的時間比較長。 -
ping模式
只能用MySQL提供的API或者mysqladmin工具才能發送ping命令到MySQL服務端。而select模式
是可以通過MySQL API或者MySQL交互式終端都能執行select查詢。
4. 推薦
因為ping模式
執行速度快,對于追求性能的程序推薦使用這種模式。另外在使用select模式
的時候,推薦優先使用select 1
這種查詢。
常見的生產項目,比如用druid來管理的數據源,一般都是用select version()
來做心跳保活的。
5. 問題
select version()
這種方式有一個缺點就是當連接因為配置不恰當導致被MySQL服務端中斷,那么客戶端在執行這條SQL語句的時候就會報錯,這樣會影響程序執行效率。因此保活的前提一定是配置正確的前提下,這個一定要在本地或者測試環境測試好。