數據庫鏈接池的原理

一.早期咱們怎麼進行數據庫操做java

1.原理:通常來講,Java應用程序訪問數據庫的過程是:git

   ①裝載數據庫驅動程序;程序員

   ②經過jdbc創建數據庫鏈接;github

   ③訪問數據庫,執行sql語句;web

   ④斷開數據庫鏈接。sql

 

 

2.分析數據庫

 

       程序開發過程當中,存在不少問題:首先,每一次web請求都要創建一次數據庫鏈接。創建鏈接是一個費時的活動,每次都得花費0.05s1s的時間,並且系統還要分配內存資源。這個時間對於一次或幾回數據庫操做,或許感受不出系統有多大的開銷。但是對於如今的web應用,尤爲是大型電子商務網站,同時有幾百人甚至幾千人在線是很正常的事。在這種狀況下,頻繁的進行數據庫鏈接操做勢必佔用不少的系統資源,網站的響應速度一定降低,嚴重的甚至會形成服務器的崩潰。不是危言聳聽,這就是制約某些電子商務網站發展的技術瓶頸問題。其次,對於每一次數據庫鏈接,使用完後都得斷開。不然,若是程序出現異常而未能關閉,將會致使數據庫系統中的內存泄漏,最終將不得不重啓數據庫。還有,這種開發不能控制被建立的鏈接對象數,系統資源會被毫無顧及的分配出去,如鏈接過多,也可能致使內存泄漏,服務器崩潰。apache

 

3.解決:設計模式

對於共享資源,有一個很著名的設計模式:資源池(resource pool)。該模式正是爲了解決資源的頻繁分配﹑釋放所形成的問題。爲解決上述問題,能夠採用數據庫鏈接池技術。數據庫鏈接池的基本思想就是爲數據庫鏈接創建一個「緩衝池」。預先在緩衝池中放入必定數量的鏈接,當須要創建數據庫鏈接時,只需從「緩衝池」中取出一個,使用完畢以後再放回去。咱們能夠經過設定鏈接池最大鏈接數來防止系統無盡的與數據庫鏈接。更爲重要的是咱們能夠經過鏈接池的管理機制監視數據庫的鏈接的數量﹑使用狀況,爲系統開發﹑測試及性能調整提供依據。服務器

 

咱們本身嘗試開發一個鏈接池,來爲上面的查詢業務提供數據庫鏈接服務:

       ①   編寫class 實現DataSource 接口

       ②   class構造器一次性建立10個鏈接,將鏈接保存LinkedList

       ③   實現getConnection  LinkedList返回一個鏈接

       ④   提供將鏈接放回鏈接池中方法

 

       1、鏈接池代碼

  1. public class MyDataSource implements DataSource {  
  2.           //鏈表 --- 實現棧結構  
  3.           privateLinkedList<Connection> dataSources = new LinkedList<Connection>();  
  4.   
  5.           //初始化鏈接數量  
  6.           publicMyDataSource() {  
  7.                  //一次性建立10個鏈接  
  8.                  for(int i = 0; i < 10; i++) {  
  9.                         try {  
  10.                            //一、裝載sqlserver驅動對象  
  11.                            DriverManager.registerDriver(new SQLServerDriver());  
  12.                            //二、經過JDBC創建數據庫鏈接  
  13.                            Connection con =DriverManager.getConnection(  
  14.                               "jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");  
  15.                            //三、將鏈接加入鏈接池中  
  16.                            dataSources.add(con);  
  17.                         } catch (Exception e) {  
  18.                            e.printStackTrace();  
  19.                         }  
  20.                  }  
  21.           }  
  22.   
  23.           @Override  
  24.           publicConnection getConnection() throws SQLException {  
  25.                  //取出鏈接池中一個鏈接  
  26.                  finalConnection conn = dataSources.removeFirst(); // 刪除第一個鏈接返回  
  27.                  returnconn;  
  28.           }  
  29.   
  30.           //將鏈接放回鏈接池  
  31.           publicvoid releaseConnection(Connection conn) {  
  32.                  dataSources.add(conn);  
  33.                  }  
  34.    } 

 

2、使用鏈接池重構咱們的用戶查詢函數       

  1. //查詢全部用戶  
  2. Public void FindAllUsers(){  
  3.        //一、使用鏈接池創建數據庫鏈接  
  4.        MyDataSource dataSource = new MyDataSource();  
  5.        Connection conn =dataSource.getConnection();          
  6.        //二、建立狀態  
  7.        Statement state =con.createStatement();             
  8.        //三、查詢數據庫並返回結果  
  9.        ResultSet result =state.executeQuery("select * from users");             
  10.        //四、輸出查詢結果  
  11.        while(result.next()){  
  12.               System.out.println(result.getString("email"));  
  13.        }              
  14.        //五、斷開數據庫鏈接  
  15.        result.close();  
  16.        state.close();  
  17.        //六、歸還數據庫鏈接給鏈接池  
  18.        dataSource.releaseConnection(conn);  
  19.  }  

 

       這就是數據庫鏈接池的原理,它大大提供了數據庫鏈接的利用率,減少了內存吞吐的開銷。

 

 

3.實際開發中有成熟的開源鏈接池供咱們使用

 

       理解了鏈接池的原理就能夠了,沒有必要什麼都從頭寫一遍,那樣會花費不少時間,而且性能及穩定性也不必定知足要求。事實上,已經存在不少流行的性能優良的第三方數據庫鏈接池jar包供咱們使用。如:

 

       1.Apache commons-dbcp 鏈接池

 

        下載:http://commons.apache.org/proper/commons-dbcp/

 

 

 

       2.c3p0 數據庫鏈接池

 

        下載:http://sourceforge.net/projects/c3p0/

 

 

 

4.實際開發推薦

介紹:https://github.com/alibaba/druid/wiki/

Druid是阿里巴巴開源平臺上的一個項目,基於Apache License 2.0協議開源,代碼託管在GitHub。整個項目由數據庫鏈接池、插件框架和SQL解析器組成。該項目主要是爲了擴展JDBC的一些限制,可讓程序員實現一些特殊的需求,好比向密鑰服務請求憑證、統計SQL信息、SQL性能收集、SQL注入檢查、SQL翻譯等,程序員能夠經過定製來實現本身須要的功能。

 

 

轉載:http://blog.csdn.net/shuaihj/article/details/14223015

相關文章
相關標籤/搜索