最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

01 天天寫CRUD,你知道你的系統(tǒng)是如何跟MySQL打交道的嗎?

2023-06-09 10:38 作者:儒猿課堂  | 我要投稿

天天寫CRUD,你知道你的系統(tǒng)是如何跟MySQL打交道的嗎?

1、Java工程師眼中的數(shù)據(jù)庫(kù)是什么東西?


從今天開(kāi)始,我們將要開(kāi)始一個(gè)MySQL的專欄,一起來(lái)研究MySQL數(shù)據(jù)庫(kù)的底層原理和各種實(shí)踐案例,以及互聯(lián)網(wǎng)公司的技術(shù)方案。


現(xiàn)在我們先來(lái)看看,在一個(gè)Java工程師眼中的數(shù)據(jù)庫(kù)是什么東西?


平時(shí)我們?cè)谧鯦ava系統(tǒng)時(shí),一般情況下都會(huì)連接到一個(gè)MySQL數(shù)據(jù)庫(kù)上去,執(zhí)行各種增刪改查的語(yǔ)句。


據(jù)我所知,目前行業(yè)里大部分的Java工程師對(duì)MySQL的了解和掌握程度,大致就停留在這么一個(gè)階段:對(duì)MySQL可以建庫(kù)建表建索引,然后就是執(zhí)行增刪改查去更新和查詢里面的數(shù)據(jù)!


所以我們看下面的圖,很多Java工程師眼中的數(shù)據(jù)庫(kù)大致就是下面這樣子。


(附加說(shuō)明:我在寫《從0開(kāi)始帶你成為JVM實(shí)戰(zhàn)高手》專欄時(shí),采用的是億圖圖示這個(gè)畫圖工具,現(xiàn)在為了統(tǒng)一畫圖風(fēng)格,本專欄會(huì)改成《從0開(kāi)始帶你成為消息中間件實(shí)戰(zhàn)高手》專欄一樣的畫圖工具)? ? ? ?

但是實(shí)際在使用MySQL的過(guò)程中,大家總會(huì)遇到這樣那樣的一些問(wèn)題,比如死鎖異常、SQL性能太差、異常報(bào)錯(cuò),等等。


很多Java工程師在遇到MySQL數(shù)據(jù)庫(kù)的一些問(wèn)題時(shí),一般都會(huì)上網(wǎng)搜索博客,然后自己嘗試搗鼓著解決一下,最后解決了問(wèn)題,自己可能也沒(méi)搞明白里面的原理。


因此我們就是要帶著大家去探索MySQL底層原理的方方面面,以及探索在解決MySQL各種生產(chǎn)實(shí)戰(zhàn)問(wèn)題的時(shí)候,如何基于MySQL底層原理去進(jìn)行分析、排查和定位。


2、MySQL驅(qū)動(dòng)到底是什么東西?


大家都知道,我們?nèi)绻贘ava系統(tǒng)中去訪問(wèn)一個(gè)MySQL數(shù)據(jù)庫(kù),必須得在系統(tǒng)的依賴中加入一個(gè)MySQL驅(qū)動(dòng),有了這個(gè)MySQL驅(qū)動(dòng)才能跟MySQL數(shù)據(jù)庫(kù)建立連接,然后執(zhí)行各種各樣的SQL語(yǔ)句。


那么這個(gè)MySQL驅(qū)動(dòng)到底是個(gè)什么東西?


我們先來(lái)看下面的一段maven配置,這段maven配置中就引入了一個(gè)MySQL驅(qū)動(dòng)。這里的mysql-connector-java就是面向Java語(yǔ)言的MySQL驅(qū)動(dòng)。



大家都知道,如果我們要訪問(wèn)數(shù)據(jù)庫(kù),必須得跟數(shù)據(jù)庫(kù)建立一個(gè)網(wǎng)絡(luò)連接,那么這個(gè)連接由誰(shuí)來(lái)建立呢?


其實(shí)答案就是這個(gè)MySQL驅(qū)動(dòng),他會(huì)在底層跟數(shù)據(jù)庫(kù)建立網(wǎng)絡(luò)連接,有網(wǎng)絡(luò)連接,接著才能去發(fā)送請(qǐng)求給數(shù)據(jù)庫(kù)服務(wù)器!我們看下圖。

? ? ? ? ? ?

然后當(dāng)我們跟數(shù)據(jù)庫(kù)之間有了網(wǎng)絡(luò)連接之后,我們的Java代碼才能基于這個(gè)連接去執(zhí)行各種各樣的增刪改查SQL語(yǔ)句


我們看下圖

? ? ? ? ? ?

所以對(duì)于Java語(yǔ)言開(kāi)發(fā)的系統(tǒng),MySQL會(huì)提供Java版本的MySQL驅(qū)動(dòng),對(duì)于PHP、Perl、.NET、Python、Ruby等各種常見(jiàn)的編程語(yǔ)言,MySQL都會(huì)提供對(duì)應(yīng)語(yǔ)言的MySQL驅(qū)動(dòng),讓各種語(yǔ)言編寫的系統(tǒng)通過(guò)MySQL驅(qū)動(dòng)去訪問(wèn)數(shù)據(jù)庫(kù)。


3、數(shù)據(jù)庫(kù)連接池到底是用來(lái)干什么的?


接著我們來(lái)思考一個(gè)問(wèn)題,一個(gè)Java系統(tǒng)難道只會(huì)跟數(shù)據(jù)庫(kù)建立一個(gè)連接嗎?


這個(gè)肯定是不行的,因?yàn)槲覀円靼滓粋€(gè)道理,假設(shè)我們用Java開(kāi)發(fā)了一個(gè)Web系統(tǒng),是部署在Tomcat中的,那么Tomcat本身肯定是有多個(gè)線程來(lái)并發(fā)的處理同時(shí)接收到的多個(gè)請(qǐng)求的,我們看下圖。

? ? ? ? ? ?

? ? ? ? ? ??

這個(gè)時(shí)候,如果Tomcat中的多個(gè)線程并發(fā)處理多個(gè)請(qǐng)求的時(shí)候,都要去搶奪一個(gè)連接去訪問(wèn)數(shù)據(jù)庫(kù)的話,那效率肯定是很低下的


我們看下面的圖

? ? ? ? ? ?

那么如果Tomcat中的每個(gè)線程在每次訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,都基于MySQL驅(qū)動(dòng)去創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接,然后執(zhí)行SQL語(yǔ)句,然后執(zhí)行完之后再銷毀這個(gè)數(shù)據(jù)庫(kù)連接,這樣行不行呢?


可能Tomcat中上百個(gè)線程會(huì)并發(fā)的頻繁創(chuàng)建數(shù)據(jù)庫(kù)連接,執(zhí)行SQL語(yǔ)句,然后頻繁的銷毀數(shù)據(jù)庫(kù)連接。


上述這個(gè)過(guò)程反復(fù)循環(huán)執(zhí)行,大家覺(jué)得可行嗎?


這也是非常不好的,因?yàn)槊看谓⒁粋€(gè)數(shù)據(jù)庫(kù)連接都很耗時(shí),好不容易建立好了連接,執(zhí)行完了SQL語(yǔ)句,你還把數(shù)據(jù)庫(kù)連接給銷毀了,下一次再重新建立數(shù)據(jù)庫(kù)連接,那肯定是效率很低下的!如下圖。

? ? ? ? ? ?

所以一般我們必須要使用一個(gè)數(shù)據(jù)庫(kù)連接池,也就是說(shuō)在一個(gè)池子里維持多個(gè)數(shù)據(jù)庫(kù)連接,讓多個(gè)線程使用里面的不同的數(shù)據(jù)庫(kù)連接去執(zhí)行SQL語(yǔ)句,然后執(zhí)行完SQL語(yǔ)句之后,不要銷毀這個(gè)數(shù)據(jù)庫(kù)連接,而是把連接放回池子里,后續(xù)還可以繼續(xù)使用。


基于這樣的一個(gè)數(shù)據(jù)庫(kù)連接池的機(jī)制,就可以解決多個(gè)線程并發(fā)的使用多個(gè)數(shù)據(jù)庫(kù)連接去執(zhí)行SQL語(yǔ)句的問(wèn)題,而且還避免了數(shù)據(jù)庫(kù)連接使用完之后就銷毀的問(wèn)題,我們看下圖的說(shuō)明。

? ? ? ? ? ?

常見(jiàn)的數(shù)據(jù)庫(kù)連接池有DBCP,C3P0,Druid,等等,大家如果有興趣的話,可以去搜索一下數(shù)據(jù)庫(kù)連接池的使用例子和代碼,甚至探索一下數(shù)據(jù)庫(kù)連接池的底層原理,但這個(gè)不是我們專欄的重點(diǎn),我們就不會(huì)拓展了。


畢竟我們專欄主要還是會(huì)專注講解MySQL數(shù)據(jù)庫(kù)本身的內(nèi)容,只不過(guò)在開(kāi)頭的時(shí)候,需要大家對(duì)Java系統(tǒng)與數(shù)據(jù)庫(kù)的交互方式有一個(gè)了解。


其實(shí)不光是Java系統(tǒng),如果你是一個(gè)Python、Ruby、.NET、PHP的程序員,這個(gè)系統(tǒng)與數(shù)據(jù)庫(kù)的交互本質(zhì)都是一樣的,都是基于數(shù)據(jù)庫(kù)連接池去與數(shù)據(jù)庫(kù)進(jìn)行交互。


4、MySQL數(shù)據(jù)庫(kù)的連接池是用來(lái)干什么的?


現(xiàn)在我們已經(jīng)知道,我們?nèi)魏我粋€(gè)系統(tǒng)都會(huì)有一個(gè)數(shù)據(jù)庫(kù)連接池去訪問(wèn)數(shù)據(jù)庫(kù),也就是說(shuō)這個(gè)系統(tǒng)會(huì)有多個(gè)數(shù)據(jù)庫(kù)連接,供多線程并發(fā)的使用。同時(shí)我們可能會(huì)有多個(gè)系統(tǒng)同時(shí)去訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),這都是有可能的。


所以當(dāng)我們把目光轉(zhuǎn)移到MySQL的時(shí)候,我們要來(lái)思考一個(gè)問(wèn)題,那就是肯定會(huì)有很多系統(tǒng)要與MySQL數(shù)據(jù)庫(kù)建立很多個(gè)連接,那么MySQL也必然要維護(hù)與系統(tǒng)之間的多個(gè)連接,所以MySQL架構(gòu)體系中的第一個(gè)環(huán)節(jié),就是連接池。


我們看下面的圖,實(shí)際上MySQL中的連接池就是維護(hù)了與系統(tǒng)之間的多個(gè)數(shù)據(jù)庫(kù)連接。除此之外,你的系統(tǒng)每次跟MySQL建立連接的時(shí)候,還會(huì)根據(jù)你傳遞過(guò)來(lái)的賬號(hào)和密碼,進(jìn)行賬號(hào)密碼的驗(yàn)證,庫(kù)表權(quán)限的驗(yàn)證。


? ? ? ? ? ?

? ? ??

5、小作業(yè):自己試一試寫代碼建立MySQL連接


當(dāng)我們看完今天的內(nèi)容后,大家可以用自己工作中經(jīng)常使用的編程語(yǔ)言,來(lái)寫一下跟MySQL建立連接的代碼,想必寫完之后,再對(duì)照今天的內(nèi)容,感受會(huì)更深一些。


另外,大家可以基于數(shù)據(jù)庫(kù)連接池框架,去寫一下對(duì)應(yīng)的代碼例子,感受一下你建立多個(gè)數(shù)據(jù)庫(kù)連接讓多個(gè)線程并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)的效果。


End

專欄版權(quán)歸公眾號(hào)儒猿技術(shù)窩所有

未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責(zé)任

01 天天寫CRUD,你知道你的系統(tǒng)是如何跟MySQL打交道的嗎?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
松桃| 汉阴县| 孟州市| 正蓝旗| 黔南| 蒙城县| 鹤山市| 汶川县| 长垣县| 利辛县| 哈尔滨市| 公主岭市| 紫阳县| 讷河市| 大宁县| 大厂| 祁阳县| 枣强县| 华蓥市| 德保县| 木兰县| 平山县| 新巴尔虎左旗| 勐海县| 白城市| 肇东市| 宜宾县| 焉耆| 弥勒县| 镇巴县| 西和县| 阳新县| 商河县| 宜兰市| 夹江县| 大安市| 陇南市| 庆元县| 依安县| 道真| 峨眉山市|