面試官:為什么數(shù)據(jù)庫連接很消耗資源?
點(diǎn)擊關(guān)注公眾號,Java干貨及時(shí)送達(dá)
作者:lmy86263
來源:blog.csdn.net/lmy86263/article/details/76165714
Class.forName("com.mysql.jdbc.Driver");
String name = "shine_user";
String password = "123";
String url = "jdbc:mysql://172.16.100.131:3306/clever_mg_test";
Connection conn = DriverManager.getConnection(url, name, password);
// 之后程序終止,連接被強(qiáng)制關(guān)閉

第1步:建立TCP連接,通過三次握手實(shí)現(xiàn); 第2步:服務(wù)器發(fā)送給客戶端握手信息,客戶端響應(yīng)該握手消息; 第3步:客戶端發(fā)送認(rèn)證包,用于用戶驗(yàn)證,驗(yàn)證成功后,服務(wù)器返回OK響應(yīng),之后開始執(zhí)行命令;
Connection.close()關(guān)閉的,而是由于程序執(zhí)行完畢,導(dǎo)致進(jìn)程終止,造成與數(shù)據(jù)庫的連接異常關(guān)閉,所以最后會(huì)出現(xiàn)TCP的RST報(bào)文。在這個(gè)最簡單的代碼中,沒有設(shè)置任何額外的連接屬性,所以在設(shè)置屬性上占用的時(shí)間可以認(rèn)為是最少的(其實(shí),雖然我們沒有設(shè)置任何屬性,但是驅(qū)動(dòng)仍然設(shè)置了字符集、事務(wù)自動(dòng)提交等,這取決于具體的驅(qū)動(dòng)實(shí)現(xiàn)),所以整個(gè)連接所使用的時(shí)間可以認(rèn)為是最少的。但從統(tǒng)計(jì)信息中可以看出,在不包括最后TCP的RST 報(bào)文時(shí)(因?yàn)樵搱?bào)文不需要服務(wù)器返回任何響應(yīng)),但是其中仍需在客戶端和服務(wù)器之間進(jìn)行往返7次,也就是說完成一次連接,可以認(rèn)為,數(shù)據(jù)在客戶端和服務(wù)器之間需要至少往返7次,從時(shí)間上來看,從開始TCP的三次握手,到最終連接強(qiáng)制斷開為止(不包括最后的RST報(bào)文),總共花費(fèi)了:Class.forName("com.mysql.jdbc.Driver");
String name = "shine_user";
String password = "123";
String url = "jdbc:mysql://172.16.100.131:3306/clever_mg_test";
Connection conn = DriverManager.getConnection(url, name, password);
conn.close();

第1步:此時(shí)處于MySQL通信協(xié)議階段,客戶端發(fā)送關(guān)閉連接請求,而且不用等待服務(wù)端的響應(yīng);
第2步:TCP斷開連接,4次揮手完成連接斷開;
緩存 SQL的預(yù)編譯 負(fù)載均衡 ……
當(dāng)然這不是本文的主要內(nèi)容,本文想要闡述的核心思想只有一個(gè),數(shù)據(jù)庫連接真的很耗時(shí),所以不要頻繁的建立連接。
往 期 推 薦
1、社區(qū)糾紛不斷:程序員何苦為難程序員? 2、該死的單元測試,寫起來到底有多痛? 3、互聯(lián)網(wǎng)人為什么學(xué)不會(huì)擺爛 4、為什么國外JetBrains做 IDE 就可以養(yǎng)活自己,國內(nèi)不行?區(qū)別在哪? 5、相比高人氣的Rust、Go,為何 Java、C 在工具層面進(jìn)展緩慢? 6、讓程序員早點(diǎn)下班的《技術(shù)寫作指南》 點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看





