一.早期咱們怎麼進行數據庫操做html
1.原理:通常來講,java應用程序訪問數據庫的過程是:java
①裝載數據庫驅動程序;web
②經過jdbc創建數據庫鏈接;sql
③訪問數據庫,執行sql語句;數據庫
④斷開數據庫鏈接。設計模式
2.代碼tomcat
Public void FindAllUsers(){服務器
//一、裝載sqlserver驅動對象
DriverManager.registerDriver(new SQLServerDriver());
//二、經過JDBC創建數據庫鏈接
Connection con =DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");
//三、建立狀態
Statement state =con.createStatement();
//四、查詢數據庫並返回結果
ResultSet result =state.executeQuery("select * from users");
//五、輸出查詢結果
while(result.next()){
System.out.println(result.getString("email"));
}
//六、斷開數據庫鏈接
result.close();
state.close();
con.close();
} 併發
3.分析ide
程序開發過程當中,存在不少問題:首先,每一次web請求都要創建一次數據庫鏈接。創建鏈接是一個費時的活動,每次都得花費0.05s~1s的時間,並且系統還要分配內存資源。這個時間對於一次或幾回數據庫操做,或許感受不出系統有多大的開銷。但是對於如今的web應用,尤爲是大型電子商務網站,同時有幾百人甚至幾千人在線是很正常的事。在這種狀況下,頻繁的進行數據庫鏈接操做勢必佔用不少的系統資源,網站的響應速度一定降低,嚴重的甚至會形成服務器的崩潰。不是危言聳聽,這就是制約某些電子商務網站發展的技術瓶頸問題。其次,對於每一次數據庫鏈接,使用完後都得斷開。不然,若是程序出現異常而未能關閉,將會致使數據庫系統中的內存泄漏,最終將不得不重啓數據庫。還有,這種開發不能控制被建立的鏈接對象數,系統資源會被毫無顧及的分配出去,如鏈接過多,也可能致使內存泄漏,服務器崩潰。
上述的用戶查詢案例,若是同時有1000人訪問,就會不斷的有數據庫鏈接、斷開操做:
經過上面的分析,咱們能夠看出來,「數據庫鏈接」是一種稀缺的資源,爲了保障網站的正常使用,應該對其進行妥善管理。其實咱們查詢完數據庫後,若是不關閉鏈接,而是暫時存放起來,當別人使用時,把這個鏈接給他們使用。就避免了一次創建數據庫鏈接和斷開的操做時間消耗。原理以下:
二. 技術演進出來的數據庫鏈接池
由上面的分析能夠看出,問題的根源就在於對數據庫鏈接資源的低效管理。咱們知道,對於共享資源,有一個很著名的設計模式:資源池(resource pool)。該模式正是爲了解決資源的頻繁分配﹑釋放所形成的問題。爲解決上述問題,能夠採用數據庫鏈接池技術。數據庫鏈接池的基本思想就是爲數據庫鏈接創建一個「緩衝池」。預先在緩衝池中放入必定數量的鏈接,當須要創建數據庫鏈接時,只需從「緩衝池」中取出一個,使用完畢以後再放回去,鏈接是是比較耗內存的。咱們能夠經過設定鏈接池最大鏈接數來防止系統無盡的與數據庫鏈接。更爲重要的是咱們能夠經過鏈接池的管理機制監視數據庫的鏈接的數量﹑使用狀況,爲系統開發﹑測試及性能調整提供依據。
咱們本身嘗試開發一個鏈接池,來爲上面的查詢業務提供數據庫鏈接服務:
① 編寫class 實現DataSource 接口
② 在class構造器一次性建立10個鏈接,將鏈接保存LinkedList中
③ 實現getConnection 從 LinkedList中返回一個鏈接
④ 提供將鏈接放回鏈接池中方法
一、鏈接池代碼
public class MyDataSource implements DataSource {
//鏈表 --- 實現棧結構
privateLinkedList<Connection> dataSources = new LinkedList<Connection>();
//初始化鏈接數量
publicMyDataSource() {
//一次性建立10個鏈接
for(int i = 0; i < 10; i++) {
try {
//一、裝載sqlserver驅動對象
DriverManager.registerDriver(new SQLServerDriver());
//二、經過JDBC創建數據庫鏈接
Connection con =DriverManager.getConnection(
"jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");
//三、將鏈接加入鏈接池中
dataSources.add(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
publicConnection getConnection() throws SQLException {
//取出鏈接池中一個鏈接
finalConnection conn = dataSources.removeFirst(); // 刪除第一個鏈接返回
returnconn;
}
//將鏈接放回鏈接池
publicvoid releaseConnection(Connection conn) {
dataSources.add(conn);
}
}
實例參考:http://www.javashuo.com/article/p-svdysxly-gh.html (包括代碼和講解)
java中幾種常見數據庫鏈接池的使用比較
一 開源數據鏈接池
1 dbcp
dbcp多是使用最多的開源鏈接池,緣由大概是由於配置方便,並且不少開源和tomcat應用例子都是使用的這個鏈接池吧。
這個鏈接池能夠設置最大和最小鏈接,鏈接等待時間等,基本功能都有。這個鏈接池的配置參見附件壓縮包中的:dbcp.xml
使用評價:在具體項目應用中,發現此鏈接池的持續運行的穩定性仍是能夠,不過速度稍慢,在大併發量的壓力下穩定性
有所降低,此外不提供鏈接池監控
2 c3p0
c3p0是另一個開源的鏈接池,在業界也是比較有名的,這個鏈接池能夠設置最大和最小鏈接,鏈接等待時間等,基本功能都有。
這個鏈接池的配置參見附件壓縮包中的:c3p0.xml。
使用評價:在具體項目應用中,發現此鏈接池的持續運行的穩定性至關不錯,在大併發量的壓力下穩定性也有必定保證,
此外不提供鏈接池監控。
3 proxool
proxool這個鏈接池可能用到的人比較少,但也有必定知名度,這個鏈接池能夠設置最大和最小鏈接,鏈接等待時間等,基本功能都有。
這個鏈接池的配置參見附件壓縮包中的:proxool.xml。
使用評價:在具體項目應用中,發現此鏈接池的持續運行的穩定性有必定問題,有一個須要長時間跑批的任務場景任務,一樣的代碼
4.Druid
阿里出品,淘寶和支付寶專用數據庫鏈接池,但它不只僅是一個數據庫鏈接池,它還包含一個,一系列內置的JDBC組件庫,一個SQL Parser
。支持全部JDBC兼容的數據庫,包括Oracle、MySql、SQL Server
Druid是目前最好的數據庫鏈接池,在功能、性能、擴展性方面,都超過其餘數據庫鏈接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。
詳情參考:https://blog.csdn.net/huanbinzhou333/article/details/5785838