淺析mysql互動式連線&非互動式連線
互動式操作:通俗的說,就是你在你的本機上開啟mysql的客戶端,就是那個黑視窗,在黑視窗下進行各種sql操作,當然走的肯定是tcp協議。
非互動式操作:就是你在你的專案中進行程式呼叫。比如一邊是tomcat web伺服器,一邊是資料庫伺服器,兩者怎麼通訊?在java web裡,我們通常會選擇hibernate或者是jdbc來連線。那麼這時候就是非互動式操作。
在之前,我基本上不關係這兩個屬性,都是用的是mysql服務商推薦的預設值,就是8小時。
但是,從昨天開始,由於在新網租用了一個空間,而他的mysql的wait_time設定了10s,所以引出來一系列的問題,就順便來研究下。
或者這個標題可以改為“mysql的8小時自動關閉”問題,這個標題你到百度上搜搜,一搜一大堆,但是都沒有講明白,今天我就給大家來說說這兩個值。
一、概念
1)interactive_time:是指如果空餘Ns(N就是這個屬性的值),那麼就會自動關閉mysql的連線。關閉什麼樣的mysql連線?在之前,我們在《什麼是mysql的互動式操作和非互動式操作?》 這篇文章中講到,mysql是有兩種操作方式,那就有兩種連線的,一種是互動式,一種是非互動式。而這個屬性控制的是互動式。就是你開啟一個mysql客 戶端黑視窗,進入操作之後,又隔了Ns你不操作了,之後你想繼續操作,對不起,mysql會在之前關閉了你的那個連線,mysql會幫你自動重新連線。
2)wait_time:是指如果空餘Ns(N就是這個屬性的值),那麼會自動kill掉mysql的一部分連線執行緒。這裡的連線就是指的是非互動式連線。
總結下,就是用比較正規的術語講:
(1)interactive_timeout:
引數含義:伺服器關閉互動式連線前等待活動的秒數。互動式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。
引數預設值:28800秒(8小時)
(2)wait_timeout:
引數含義:伺服器關閉非互動連線之前等待活動的秒數。
線上程啟動時,根據全域性wait_timeout值或全域性interactive_timeout值初始化會話wait_timeout值,取決於客戶端型別(由mysql_real_connect()的連線選項CLIENT_INTERACTIVE定義)。
引數預設值:28800秒(8小時)
這裡有引出了另外一個概念:mysql_real_connect(),這個好理解,就是你不管什麼連線,是互動式還是非互動式,你要操作mysql之前要必須執行完畢的方法,其實你可以理解成登入mysql,或者拿到mysql的一個連線。
二、如何檢視、重新設定這兩個值
這是我修改之後的。這是檢視方法。
修改這兩個值是分為兩種修改的。
1) 修改當前會話的這兩個屬性值。所謂的當前會話就是你當前獲取的連線池的連線。比如你開啟黑視窗那個會話。這個修改比較簡單,直接set wait_timeout=10;就行了,你怎麼知道這麼修改僅僅修改的是當前會話?很簡單,你把這個黑視窗關了,你再重新開一個,再重新查,你發現沒改 啊。
2)修改全域性的屬性值。一般這個用的多,你到你的資料庫安裝包下找到my.ini,在最下面新增wait_timeout=10就可以了,然後重新啟動mysql服務,我說的重新啟動服務,不是你關閉這個黑視窗,重新啟動一個黑視窗。服務在我的電腦右鍵服務裡去找。
現在先說到這裡,一會繼續。
一、mysql8小時異常
1)異常概念。
大 家都知道mysql的8小時自動斷開異常吧,百度上一大把。就是由於這個值造成的,這個值mysql預設的是8小時,所以如果你在8小時內,資料庫覺得沒 有任何人來連線我,那好,我就將所有的現在存在的非互動式連線全部kill掉。而ssh中,我們一般用的是資料池。就是在tomcat已啟動的時候,就向 mysql申請到N(這個N是你配置的)個非互動是連線,以後想要用資料庫連線的時候,沒有必要一個請求就去重新獲取mysql連線,只要從資料池裡獲取 就可以了。但是現在如果你8小時之內,沒有傳送請求,那麼mysql會自動將所有的非互動是連線kill掉,那這時候,你的資料庫連線池裡存在的資料庫連 接其實是null,是不存在的,你這時候也不判斷,繼續想用這個連結去請求資料,當然會丟擲異常,所丟擲的異常Communications link failure due to underlying exception。
2)那麼如何解決呢?
原 理很簡單,出現這個異常的原因不就是因為連線池裡存在著已經不存在的連線,而且你還不知道,你還得用這個原本就被關閉的連線去請求嗎?這就好辦了,你控制 了不了伺服器的mysql(如果你是空間的話),那你知道控制自己的資料庫連線池了,讓連線池增加一個驗證功能,就是凡是在從池裡拿到連線之後,在用之前 先驗證下這個連結是否有效,如果有效則可以直接使用,如果無效則重新申請一個連線,這樣就不會出現這個異常了。當然,肯定效能會降低。關於效能為什麼降 低,我們稍後會講,現在來看,如何實現讓資料庫連線池先驗證是否有效再用的功能:
我用的連線池是c3p0,建議使用這個。當然各個連線池的效能優缺點你得根據自己的專案具體分析,這裡可不分析我為什麼選c3p0了。
?
|
所以也就是透過兩個動作去維護這個連線池,如圖:
3)解決方案的效能問題
A)檢測有效性的效能最佳化
因為要去時刻檢查這個連結是否還有效,所以效率比如會降低,那麼如何檢查呢?預設的檢查方式我現在還真不知道,但是上面一段話說了,如果使用 automaticTestTable 方法進行驗證測試連線的有效性,會對效能有所提升。那我們就來看下這個屬性
1
這 個屬性是什麼意思呢?就是他會自動的幫你建立一張名字叫C3P0TestTable的表,這種表非常的簡單,而且最關鍵的是裡面沒有資料,檢測的時候,可 以透過連線訪問這種表是否能訪問的到,如果能訪問的到,說明這個連結是有效的,否則說明這個連結已經被mysql kill掉了。
那這張表是我們程式設計師建立的嗎?NO,你不用管,你只要這麼配置上,自然會幫你自動建立一張這個表的。
B)testConnectionOnCheckout 效能的最佳化。因為這個屬性是指你從連線池中拿出來的時候,在每一個連結去真正提交,震中拿著這個連結去資料庫訪問的時候,要做下檢查,並不是說,我從連線 池中拿出來,我就做檢查,我得等到提交的時候才做檢查的,那這樣會設計到一個connection提交的問題,在預設的情況下,你傳送一個db request就會自動馬上去執行,就會馬上commit的,如果你配置在事務當中呢,就是一個action方法對應一個biz方法,這樣你只要做一次檢 查就行了,減少了檢測的次數。
也就是說,對於這種解決方案的效能最佳化的宗旨就是減少檢測次數、最佳化檢測方法。
二、mysql的wait_timeout值應該設定多少?
如果你不是IDC,你不是往外出租伺服器,那麼你完全可以設定為預設值8小時就可以了。但是如果IDC往外租用伺服器的時候,就得重新設定了,比如新網就是設定為10s的。
但 是這個設定為多大,並不是新網那樣隨便設定的,因為我發現新網的這個伺服器業務壓力並不是很大,但是他卻設定了一個10s這麼小的值,這樣反而會更消耗服 務器資源。是,得承認,如果這個值過大的話,很可能會造成大量的無用的閒置的連線存在,對資料庫壓力過大,但是新網的那個伺服器的業務壓力並不大啊,你設 置成這麼小的數值,很明顯,你是在刻意的增加系統伺服器的業務壓力啊,罪人啊罪人。
所以,設定為多大,得根據你的伺服器的壓力大小來配置的,可不是隨便寫一個數就行了的。
以上這篇淺析mysql互動式連線&非互動式連線就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援指令碼之家。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2768/viewspace-2805876/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 阿里雲 PAI 互動式建模(DSW)ProxyClient 進行 SSH 連線阿里AIclient
- MySQL 非同步驅動淺析 (三):連線池改進方案MySql非同步
- 技術分享 | MySQL : SSL 連線淺析MySql
- Steam互動式推薦模型正式上線模型
- 利用 swagger 編輯互動式線上文件Swagger
- MySQL伺服器連線過程淺析MySql伺服器
- 互動式 .Net
- MyEclipse中連線MySQL的問題淺析ZPEclipseMySql
- 撒花!《互動式線性代數》完整版正式釋出!支援線上全互動式體驗(含原始碼,離線也能看)原始碼
- 怎麼遠端連線伺服器 強大互動工具伺服器
- mysql階段04 連線工具, 連線方式, 啟動關閉mysqlMySql
- Reactive Spring實戰 -- 響應式MySql互動ReactSpringMySql
- 蘋果6跟淘雲互動連線不上怎麼回事蘋果
- JDBC連線資料庫實現增刪改查前端互動JDBC資料庫前端
- [玩轉MySQL之二]MySQL連線機制淺析及運維MySql運維
- Powershell————2、Powershell互動式
- 互動式 .Net 容器版
- MySQL 的啟動和連線方式MySql
- 互動投影+沉浸式互動投影綜合解決方案
- 淺析《死亡擱淺》的“連線”——從玩法到核心
- 基於 Canvas 的 HTML5 互動式地鐵線路圖CanvasHTML
- 基於HTML5Canvas的互動式地鐵線路圖HTMLCanvas
- 1204 斷開式連線
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- Mysql中常用函式 分組,連線查詢MySql函式
- HTTP非持續連線和持續連線HTTP
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- 完結!《沉浸式線性代數》完整版正式釋出,全互動式體驗
- 互動媒體日常——線條庫
- 通過驅動建立與MySQL的連線MySql
- 互動式反彙編ida pro
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- 2.3.3 關於使用非互動式/靜默DBCA建立資料庫資料庫
- mysql啟動不了,mysql連線不上,問題排查MySql
- mysql資料庫如何使用concat函式連線字串MySql資料庫函式字串
- Linux Shell互動式自動化運維程式Linux運維
- 可以玩的UI-iOS互動式動畫UIiOS動畫
- Python 連線 MySQLPythonMySql