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