日常啰嗦
終于回到既定軌道上了,這一篇講講數(shù)據(jù)庫(kù)連接池的相關(guān)知識(shí),線程池以后有機(jī)會(huì)再結(jié)合項(xiàng)目單獨(dú)寫篇文章(自己給自己挖坑,不知道什么時(shí)候能填上),從這一篇文章開始到本階段結(jié)束的文章都會(huì)圍繞數(shù)據(jù)庫(kù)和dao層的優(yōu)化去寫,本篇是一個(gè)開始。本文會(huì)介紹連接池技術(shù)并對(duì)比目前比較流行的java連接池技術(shù),之后,會(huì)把druid整合到項(xiàng)目中來,將技術(shù)方案落地,實(shí)際整合到項(xiàng)目中,讓技術(shù)能為我所用。
使用連接池的原因
jdbc的demo
//第一步,注冊(cè)驅(qū)動(dòng)程序 //com.MySQL.jdbc.Driver Class.forName("數(shù)據(jù)庫(kù)驅(qū)動(dòng)的完整類名");//第二步,獲取一個(gè)數(shù)據(jù)庫(kù)的連接 Connection conn = DriverManager.getConnection("數(shù)據(jù)庫(kù)地址","用戶名","密碼"); //第三步,創(chuàng)建一個(gè)會(huì)話 Statement stmt=conn.createStatement(); //第四步,執(zhí)行SQL語句 stmt.executeUpdate("SQL語句"); //或者查詢記錄 ResultSet rs = stmt.executeQuery("查詢記錄的SQL語句"); //第五步,對(duì)查詢的結(jié)果進(jìn)行處理 while(rs.next()){ //操作 } //第六步,關(guān)閉連接 rs.close(); stmt.close(); conn.close();
對(duì)上面幾行代碼,大家不會(huì)陌生,這可能是我們初學(xué)jdbc連接時(shí)最熟悉的代碼了,雖然現(xiàn)在可能用到了一些數(shù)據(jù)層ORM框架,但是底層實(shí)現(xiàn)依然如同上面代碼一樣,只是做了一些封裝而已。這種方式也有一些不足,在與mysql進(jìn)行數(shù)據(jù)交互時(shí)每次都需要新建connection資源,用完后關(guān)閉掉Connection資源,這種做法是非常浪費(fèi)資源的,如果抬杠的話,可能有人會(huì)說,我就喜歡這種方式,我服務(wù)器配置足夠好,我一點(diǎn)都不擔(dān)心什么資源不資源,那你牛逼。
浪費(fèi)資源這種說法是相對(duì)而言的,如果在小型項(xiàng)目中或者項(xiàng)目與數(shù)據(jù)庫(kù)的交互不那么頻繁的話,數(shù)據(jù)庫(kù)連接的創(chuàng)建與關(guān)閉也不見得會(huì)把資源浪費(fèi)多少,亦或者在項(xiàng)目啟動(dòng)時(shí)期,我們可能只考慮功能實(shí)現(xiàn),就直接copy一份現(xiàn)成的數(shù)據(jù)庫(kù)集成代碼過來用,這種做法都是很正常的現(xiàn)象,本階段的內(nèi)容主要是項(xiàng)目?jī)?yōu)化,那么關(guān)注點(diǎn)肯定就不是項(xiàng)目初始時(shí)期,也不去討論硬件配置有多好,而是針對(duì)目前代碼中的不足進(jìn)行優(yōu)化,找到一個(gè)相對(duì)較好的優(yōu)化方案,并落實(shí)到項(xiàng)目中去,今天我們講的優(yōu)化方案就是使用連接池技術(shù)代替目前與數(shù)據(jù)庫(kù)的交互方式。
為什么在連接數(shù)據(jù)庫(kù)時(shí)要使用連接池?
數(shù)據(jù)庫(kù)連接是一種關(guān)鍵的有限的昂貴的資源,一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象均對(duì)應(yīng)一個(gè)物理數(shù)據(jù)庫(kù)連接,每次操作都打開一個(gè)物理連接,使用完都關(guān)閉連接,這樣造成系統(tǒng)的性能低下。
數(shù)據(jù)庫(kù)連接池的解決方案是在應(yīng)用程序啟動(dòng)時(shí)建立足夠的數(shù)據(jù)庫(kù)連接,并將這些連接組成一個(gè)連接池,簡(jiǎn)單的說,就是在一個(gè)"池"里放了好多半成品的數(shù)據(jù)庫(kù)連接對(duì)象,由應(yīng)用程序動(dòng)態(tài)地對(duì)池中的連接進(jìn)行申請(qǐng)、使用和釋放等操作。
連接池技術(shù)盡可能多地重用了消耗內(nèi)存地資源,大大節(jié)省了內(nèi)存,提高了服務(wù)器的服務(wù)效率,減少了程序與數(shù)據(jù)庫(kù)交互時(shí)的部分開銷,顯著的改善應(yīng)用程序的性能,通過使用連接池,提高了程序運(yùn)行效率,同時(shí),我們可以通過其自身的管理機(jī)制來監(jiān)視數(shù)據(jù)庫(kù)連接的數(shù)量、使用情況等。
連接池的工作原理
連接池技術(shù)的核心思想是連接復(fù)用(也是我們?cè)谇耙黄恼轮刑岬降馁Y源重用),通過建立一個(gè)數(shù)據(jù)庫(kù)連接池以及一套連接使用、分配和管理策略,使得該連接池中的連接可以得到高效、安全的復(fù)用,避免了