開源數據庫鏈接池之DBCP

  本篇介紹幾種開源數據庫鏈接池,同時重點講述如何使用Apache公司的的DBCP數據庫鏈接池。html

  前面一篇博客已經重點講述了使用數據庫鏈接池的好處,便是將屢次建立鏈接轉變爲一次建立而使用長鏈接模式。這樣能減小數據庫建立鏈接的消耗。正是因爲數據庫鏈接池的思想很是重要,因此市面上也有不少開源的數據庫鏈接池供咱們使用。主要有如下三個:java

  DBCP數據庫鏈接池mysql

  C3P0 數據庫鏈接池web

  Tomcat內置的數據庫鏈接池(DBCP)sql

  本篇主要講述DBCP數據庫鏈接池的使用,關於另外兩個數據庫鏈接池的用法請看《開源數據庫鏈接池之C3P0》 、《開源數據庫鏈接池之Tomcat內置鏈接池》 。若是咱們使用這些開源的數據庫鏈接池,咱們就能夠省略像前一篇博客中本身建立數據庫鏈接池的步驟,這樣會省略咱們不少事。數據庫

  DBCP是Apache軟件基金組織下的開源鏈接池的實現,使用DBCP數據源,須要在咱們的web工程中添加如下兩個開源jar包:apache

  ·Commons-dbcp.jaride

  ·Commons-pool.jar工具

  到如今爲止,DBCP和POOL已經都已經升爲DBCP2和POOL2,DBCP2.x和DBCP1.x並不兼容,用戶應該注意在使用DBCP配置文件上的選項可能發生了改變(如maxAction變成了maxTotal)等等。學習

  對於使用開源數據庫鏈接池,最重要的就是如何設置配置文件中的配置信息,Apache官網中提供了最新版的DBCP2.1.1的配置關鍵詞和其做用:http://commons.apache.org/proper/commons-dbcp/configuration.html 咱們能夠從這個網頁中的表格裏拾取咱們須要的有用的配置參數。

  但在本例中我並不打算使用最新版的DBCP2,而是使用DBCP1.4。

 

例:簡單地使用DBCP數據庫鏈接池

  建立工程JdbcPoolLearning,添加咱們的commons-dbcp-1.4.jar包和commons-pool-1.6.jar包,固然別忘了數據庫驅動jar包:

  

接着在工程的【src】目錄下放置咱們的配置文件dbcpconfig.properties,配置文件內容以下:

#鏈接設置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=root

#<!-- 初始化鏈接 -->
initialSize=10

#最大鏈接數量
maxActive=50

#<!-- 最大空閒鏈接 -->
maxIdle=20

#<!-- 最小空閒鏈接 -->
minIdle=5

#<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒 -->
maxWait=60000


#JDBC驅動創建鏈接時附帶的鏈接屬性屬性的格式必須爲這樣:[屬性名=property;] 
#注意:"user" 與 "password" 兩個屬性會被明確地傳遞,所以這裏不須要包含他們。
connectionProperties=useUnicode=true;characterEncoding=UTF8

#指定由鏈接池所建立的鏈接的自動提交(auto-commit)狀態。
defaultAutoCommit=true

#driver default 指定由鏈接池所建立的鏈接的只讀(read-only)狀態。
#若是沒有設置該值,則「setReadOnly」方法將不被調用。(某些驅動並不支持只讀模式,如:Informix)
defaultReadOnly=

#driver default 指定由鏈接池所建立的鏈接的事務級別(TransactionIsolation)。
#可用值爲下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED

  上面是配置文件中的配置參數,固然咱們只選取部分的參數便可知足咱們demo的演示,若是在實際開發過程當中須要使用到DBCP更多的功能,能夠本身再在這份配置文件上添加上配置參數,配置參數能夠從http://commons.apache.org/proper/commons-dbcp/configuration.html該網站上獲取,但要注意這是DBCP2版本的配置參數,部分和DBCP1.x的參數命名不一樣。

  一般咱們會將獲取鏈接做爲一個工具類,如《JDBC操做數據庫的學習(2)》中的JdbcUtils工具類同樣,但咱們知道,如今咱們要想獲取鏈接再也不是直接從數據庫建立而來,而是從鏈接池中獲取,所以JdbcUtils工具類獲取鏈接的方法getConnection就跟之前不一樣了,代碼以下:

 1 public class JdbcUtils {       //JDBC工具類
 2     private static Properties config;  3     private static DataSource ds ;  4     static{  5         InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");   //將配置文件以流的形式返回
 6         try {  7             config = new Properties();  8             config.load(in);  //加載配置文件
 9             ds = BasicDataSourceFactory.createDataSource(config); //根據配置文件建立鏈接池
10             
11         } catch (Exception e) { 12             throw new ExceptionInInitializerError(e); 13  } 14  } 15     
16     public static Connection getConnection() throws SQLException { 17         return ds.getConnection();   //獲取鏈接
18  } 19     
20     public static void release(Connection conn,Statement st,ResultSet rs) {   //釋放資源的代碼仍是跟之前同樣
21         if(rs!=null) { 22             try{ 23  rs.close(); 24             }catch (Exception e) { 25  e.printStackTrace(); 26  } 27             rs = null; 28  } 29         if(st!=null) { 30             try{ 31  st.close(); 32             }catch (Exception e) { 33  e.printStackTrace(); 34  } 35             st = null; 36  } 37         if(conn!=null) { 38             try{ 39  conn.close(); 40             }catch (Exception e) { 41  e.printStackTrace(); 42  } 43             conn = null; 44  } 45  } 46 }
View Code

  經過以上步驟,就已經使用DBCP建立好了一個數據庫鏈接池,很簡單吧。全部咱們須要修改的功能參數只要在配置文件裏面修改便可。這個工具類和之前的工具類大體仍是相似的,區別在於不須要人爲地使用Class.forname方法加載數據庫驅動,全部的一切,如加載數據庫驅動,加載數據庫URL,加載數據庫用戶名和密碼都只要經過配置文件和DBCP的BasicDataSourceFactory對象便可解決。

  DBCP最大的特色在於能夠直接使用Properties對象直接將配置信息經過BasicDataSourceFactory工廠對象的createDataSource方法設置配置文件中的各個參數。

  一樣咱們看到釋放資源的代碼跟之前仍是相同的,一點都沒改變,這也間接地說明了在這個JdbcUtils工具類中的release方法中的Connection的close方法其實根本不會調用,即便咱們在別的方法中調用了某個鏈接Connection對象的close方法,其實也是被DBCP覆寫的close方法,這跟咱們上一篇自定義數據庫鏈接池的方法是相似的,換句話說,由DBCP跟咱們的鏈接對象根本不是數據庫直接提供給咱們的Connection對象,而是通過包裝或者動態代理設計後的Connection對象,至於使用了哪一種加強方式,這個要看是什麼開源的數據庫鏈接了,咱們能夠對上面的代碼小小測試一下:

 1 public void testConnection() throws SQLException {  2         Connection conn = null;  3         PreparedStatement st = null;  4         ResultSet rs = null;  5         
 6         try{  7             conn = JdbcUtils.getConnection();  8  System.out.println(conn);  9  System.out.println(conn.getClass().getName()); 10         }finally{ 11  JdbcUtils.release(conn, st, rs); 12  } 13 }
View Code

在控制檯上的效果以下:

  

  能夠看到DBCP返回給咱們的鏈接實際上是一個包裝後的Connection對象,不用說也知道這個包裝的Connection對象確定覆寫了close方法,以使咱們在釋放資源時能將鏈接從新啊返回到DBCP的鏈接池中。

相關文章
相關標籤/搜索