淺析mysql交互式連接&非交互式連接
交互式操作:通俗的說(shuō),就是你在你的本機(jī)上打開(kāi)mysql的客戶端,就是那個(gè)黑窗口,在黑窗口下進(jìn)行各種sql操作,當(dāng)然走的肯定是tcp協(xié)議。
非交互式操作:就是你在你的項(xiàng)目中進(jìn)行程序調(diào)用。比如一邊是tomcat web服務(wù)器,一邊是數(shù)據(jù)庫(kù)服務(wù)器,兩者怎么通信?在java web里,我們通常會(huì)選擇hibernate或者是jdbc來(lái)連接。那么這時(shí)候就是非交互式操作。
在之前,我基本上不關(guān)系這兩個(gè)屬性,都是用的是mysql服務(wù)商推薦的默認(rèn)值,就是8小時(shí)。
但是,從昨天開(kāi)始,由于在新網(wǎng)租用了一個(gè)空間,而他的mysql的wait_time設(shè)置了10s,所以引出來(lái)一系列的問(wèn)題,就順便來(lái)研究下。
或者這個(gè)標(biāo)題可以改為“mysql的8小時(shí)自動(dòng)關(guān)閉”問(wèn)題,這個(gè)標(biāo)題你到百度上搜搜,一搜一大堆,但是都沒(méi)有講明白,今天我就給大家來(lái)說(shuō)說(shuō)這兩個(gè)值。
一、概念
1)interactive_time:是指如果空余Ns(N就是這個(gè)屬性的值),那么就會(huì)自動(dòng)關(guān)閉mysql的連接。關(guān)閉什么樣的mysql連接?在之前,我們?cè)凇妒裁词莔ysql的交互式操作和非交互式操作?》 這篇文章中講到,mysql是有兩種操作方式,那就有兩種連接的,一種是交互式,一種是非交互式。而這個(gè)屬性控制的是交互式。就是你打開(kāi)一個(gè)mysql客 戶端黑窗口,進(jìn)入操作之后,又隔了Ns你不操作了,之后你想繼續(xù)操作,對(duì)不起,mysql會(huì)在之前關(guān)閉了你的那個(gè)連接,mysql會(huì)幫你自動(dòng)重新連接。
2)wait_time:是指如果空余Ns(N就是這個(gè)屬性的值),那么會(huì)自動(dòng)kill掉mysql的一部分連接線程。這里的連接就是指的是非交互式連接。
總結(jié)下,就是用比較正規(guī)的術(shù)語(yǔ)講:
(1)interactive_timeout:
參數(shù)含義:服務(wù)器關(guān)閉交互式連接前等待活動(dòng)的秒數(shù)。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項(xiàng)的客戶端。
參數(shù)默認(rèn)值:28800秒(8小時(shí))
(2)wait_timeout:
參數(shù)含義:服務(wù)器關(guān)閉非交互連接之前等待活動(dòng)的秒數(shù)。
在線程啟動(dòng)時(shí),根據(jù)全局wait_timeout值或全局interactive_timeout值初始化會(huì)話wait_timeout值,取決于客戶端類型(由mysql_real_connect()的連接選項(xiàng)CLIENT_INTERACTIVE定義)。
參數(shù)默認(rèn)值:28800秒(8小時(shí))
這里有引出了另外一個(gè)概念:mysql_real_connect(),這個(gè)好理解,就是你不管什么連接,是交互式還是非交互式,你要操作mysql之前要必須執(zhí)行完畢的方法,其實(shí)你可以理解成登錄mysql,或者拿到mysql的一個(gè)連接。
二、如何查看、重新設(shè)置這兩個(gè)值
這是我修改之后的。這是查看方法。
修改這兩個(gè)值是分為兩種修改的。
1) 修改當(dāng)前會(huì)話的這兩個(gè)屬性值。所謂的當(dāng)前會(huì)話就是你當(dāng)前獲取的連接池的連接。比如你打開(kāi)黑窗口那個(gè)會(huì)話。這個(gè)修改比較簡(jiǎn)單,直接set wait_timeout=10;就行了,你怎么知道這么修改僅僅修改的是當(dāng)前會(huì)話?很簡(jiǎn)單,你把這個(gè)黑窗口關(guān)了,你再重新開(kāi)一個(gè),再重新查,你發(fā)現(xiàn)沒(méi)改 啊。
2)修改全局的屬性值。一般這個(gè)用的多,你到你的數(shù)據(jù)庫(kù)安裝包下找到my.ini,在最下面添加wait_timeout=10就可以了,然后重新啟動(dòng)mysql服務(wù),我說(shuō)的重新啟動(dòng)服務(wù),不是你關(guān)閉這個(gè)黑窗口,重新啟動(dòng)一個(gè)黑窗口。服務(wù)在我的電腦右鍵服務(wù)里去找。
現(xiàn)在先說(shuō)到這里,一會(huì)繼續(xù)。
一、mysql8小時(shí)異常
1)異常概念。
大 家都知道m(xù)ysql的8小時(shí)自動(dòng)斷開(kāi)異常吧,百度上一大把。就是由于這個(gè)值造成的,這個(gè)值mysql默認(rèn)的是8小時(shí),所以如果你在8小時(shí)內(nèi),數(shù)據(jù)庫(kù)覺(jué)得沒(méi) 有任何人來(lái)連接我,那好,我就將所有的現(xiàn)在存在的非交互式連接全部kill掉。而ssh中,我們一般用的是數(shù)據(jù)池。就是在tomcat已啟動(dòng)的時(shí)候,就向 mysql申請(qǐng)到N(這個(gè)N是你配置的)個(gè)非交互是連接,以后想要用數(shù)據(jù)庫(kù)連接的時(shí)候,沒(méi)有必要一個(gè)請(qǐng)求就去重新獲取mysql連接,只要從數(shù)據(jù)池里獲取 就可以了。但是現(xiàn)在如果你8小時(shí)之內(nèi),沒(méi)有發(fā)送請(qǐng)求,那么mysql會(huì)自動(dòng)將所有的非交互是連接kill掉,那這時(shí)候,你的數(shù)據(jù)庫(kù)連接池里存在的數(shù)據(jù)庫(kù)連 接其實(shí)是null,是不存在的,你這時(shí)候也不判斷,繼續(xù)想用這個(gè)鏈接去請(qǐng)求數(shù)據(jù),當(dāng)然會(huì)拋出異常,所拋出的異常Communications link failure due to underlying exception。
2)那么如何解決呢?
原 理很簡(jiǎn)單,出現(xiàn)這個(gè)異常的原因不就是因?yàn)檫B接池里存在著已經(jīng)不存在的連接,而且你還不知道,你還得用這個(gè)原本就被關(guān)閉的連接去請(qǐng)求嗎?這就好辦了,你控制 了不了服務(wù)器的mysql(如果你是空間的話),那你知道控制自己的數(shù)據(jù)庫(kù)連接池了,讓連接池增加一個(gè)驗(yàn)證功能,就是凡是在從池里拿到連接之后,在用之前 先驗(yàn)證下這個(gè)鏈接是否有效,如果有效則可以直接使用,如果無(wú)效則重新申請(qǐng)一個(gè)連接,這樣就不會(huì)出現(xiàn)這個(gè)異常了。當(dāng)然,肯定性能會(huì)降低。關(guān)于性能為什么降 低,我們稍后會(huì)講,現(xiàn)在來(lái)看,如何實(shí)現(xiàn)讓數(shù)據(jù)庫(kù)連接池先驗(yàn)證是否有效再用的功能:
我用的連接池是c3p0,建議使用這個(gè)。當(dāng)然各個(gè)連接池的性能優(yōu)缺點(diǎn)你得根據(jù)自己的項(xiàng)目具體分析,這里可不分析我為什么選c3p0了。
<property name="testConnectionOnCheckin" value="true"/>//歸還給連接池時(shí)候要檢查 <property name="testConnectionOnCheckout" value="true"/>//從連接池中拿出來(lái)要檢查 <!--因性能消耗大請(qǐng)只在需要的時(shí)候使用它。如果設(shè)為true那么在每個(gè)connection提交的 時(shí)候都將校驗(yàn)其有效性。建議使用idleConnectionTestPeriod或automaticTestTable 等方法來(lái)提升連接測(cè)試的性能。Default: false --> <property name="testConnectionOnCheckout">false</property> <!--如果設(shè)為true那么在取得連接的同時(shí)將校驗(yàn)連接的有效性。Default: false --> <property name="testConnectionOnCheckin">true</property>
所以也就是通過(guò)兩個(gè)動(dòng)作去維護(hù)這個(gè)連接池,如圖:
3)解決方案的性能問(wèn)題
A)檢測(cè)有效性的性能優(yōu)化
因?yàn)橐r(shí)刻檢查這個(gè)鏈接是否還有效,所以效率比如會(huì)降低,那么如何檢查呢?默認(rèn)的檢查方式我現(xiàn)在還真不知道,但是上面一段話說(shuō)了,如果使用 automaticTestTable 方法進(jìn)行驗(yàn)證測(cè)試連接的有效性,會(huì)對(duì)性能有所提升。那我們就來(lái)看下這個(gè)屬性
1 <property name="automaticTestTable" value="C3P0TestTable"/>
這 個(gè)屬性是什么意思呢?就是他會(huì)自動(dòng)的幫你建立一張名字叫C3P0TestTable的表,這種表非常的簡(jiǎn)單,而且最關(guān)鍵的是里面沒(méi)有數(shù)據(jù),檢測(cè)的時(shí)候,可 以通過(guò)連接訪問(wèn)這種表是否能訪問(wèn)的到,如果能訪問(wèn)的到,說(shuō)明這個(gè)鏈接是有效的,否則說(shuō)明這個(gè)鏈接已經(jīng)被mysql kill掉了。
那這張表是我們程序員建立的嗎?NO,你不用管,你只要這么配置上,自然會(huì)幫你自動(dòng)建立一張這個(gè)表的。
B)testConnectionOnCheckout 性能的優(yōu)化。因?yàn)檫@個(gè)屬性是指你從連接池中拿出來(lái)的時(shí)候,在每一個(gè)鏈接去真正提交,震中拿著這個(gè)鏈接去數(shù)據(jù)庫(kù)訪問(wèn)的時(shí)候,要做下檢查,并不是說(shuō),我從連接 池中拿出來(lái),我就做檢查,我得等到提交的時(shí)候才做檢查的,那這樣會(huì)設(shè)計(jì)到一個(gè)connection提交的問(wèn)題,在默認(rèn)的情況下,你發(fā)送一個(gè)db request就會(huì)自動(dòng)馬上去執(zhí)行,就會(huì)馬上commit的,如果你配置在事務(wù)當(dāng)中呢,就是一個(gè)action方法對(duì)應(yīng)一個(gè)biz方法,這樣你只要做一次檢 查就行了,減少了檢測(cè)的次數(shù)。
也就是說(shuō),對(duì)于這種解決方案的性能優(yōu)化的宗旨就是減少檢測(cè)次數(shù)、優(yōu)化檢測(cè)方法。
二、mysql的wait_timeout值應(yīng)該設(shè)置多少?
如果你不是IDC,你不是往外出租服務(wù)器,那么你完全可以設(shè)置為默認(rèn)值8小時(shí)就可以了。但是如果IDC往外租用服務(wù)器的時(shí)候,就得重新設(shè)置了,比如新網(wǎng)就是設(shè)置為10s的。
但 是這個(gè)設(shè)置為多大,并不是新網(wǎng)那樣隨便設(shè)置的,因?yàn)槲野l(fā)現(xiàn)新網(wǎng)的這個(gè)服務(wù)器業(yè)務(wù)壓力并不是很大,但是他卻設(shè)置了一個(gè)10s這么小的值,這樣反而會(huì)更消耗服 務(wù)器資源。是,得承認(rèn),如果這個(gè)值過(guò)大的話,很可能會(huì)造成大量的無(wú)用的閑置的連接存在,對(duì)數(shù)據(jù)庫(kù)壓力過(guò)大,但是新網(wǎng)的那個(gè)服務(wù)器的業(yè)務(wù)壓力并不大啊,你設(shè) 置成這么小的數(shù)值,很明顯,你是在刻意的增加系統(tǒng)服務(wù)器的業(yè)務(wù)壓力啊,罪人啊罪人。
所以,設(shè)置為多大,得根據(jù)你的服務(wù)器的壓力大小來(lái)配置的,可不是隨便寫(xiě)一個(gè)數(shù)就行了的。
以上這篇淺析mysql交互式連接&非交互式連接就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- phpmyadmin中為站點(diǎn)設(shè)置mysql權(quán)限的圖文方法
- node.js學(xué)習(xí)之交互式解釋器REPL詳解
- Linux中安裝Python的交互式解釋器IPython的教程
- Shell腳本中非交互式修改密碼的兩種方法
- Linux下交互式與非交互式修改用戶密碼的例子
- PowerShell入門(mén)教程之高效使用PowerShell交互式運(yùn)行環(huán)境的幾個(gè)小技巧
- ruby開(kāi)發(fā)的交互式程序例子
- python實(shí)現(xiàn)定制交互式命令行的方法
- IIS 配置PHP站點(diǎn)的說(shuō)明
- PHP MYSQL簡(jiǎn)易交互式站點(diǎn)開(kāi)發(fā)
相關(guān)文章
MySQL中主從復(fù)制重復(fù)鍵問(wèn)題修復(fù)方法
這篇文章主要介紹了MySQL中主從復(fù)制重復(fù)鍵問(wèn)題修復(fù),需要的朋友可以參考下2014-12-12mysql SELECT語(yǔ)句去除某個(gè)字段的重復(fù)信息
mysql SELECT語(yǔ)句去除某個(gè)字段的重復(fù)信息,需要的朋友可以收藏下。2010-04-04Mysql詳細(xì)剖析數(shù)據(jù)庫(kù)中的存儲(chǔ)引擎
這篇文章詳細(xì)剖析了數(shù)據(jù)庫(kù)中的存儲(chǔ)引擎,存儲(chǔ)引擎是數(shù)據(jù)庫(kù)中非常關(guān)鍵的部分,有感興趣的小伙伴可以參考閱讀本文2023-03-03使用Mysql5.x以上版本出現(xiàn)報(bào)錯(cuò)#1929 Incorrect datetime value: '''''''' f
我的MySQL安裝后,保存刪除表數(shù)據(jù)總是出現(xiàn)#1929 Incorrect datetime value: '' for column 'createtime' 的報(bào)錯(cuò)提醒,導(dǎo)致不能刪除表里數(shù)據(jù)。下面小編給大家分析原因及解決辦法,需要的朋友可以參考下2017-01-01MySQL數(shù)據(jù)庫(kù)之約束簡(jiǎn)析
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)之約束簡(jiǎn)析,約束是作用于表中字段上的規(guī)則,用于限制存儲(chǔ)在表中的數(shù)據(jù),保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確、有效性和完整性,需要的朋友可以參考下2023-09-09