本篇介紹幾種開源數據庫鏈接池,同時重點講述如何使用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 }
經過以上步驟,就已經使用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 }
在控制檯上的效果以下:
能夠看到DBCP返回給咱們的鏈接實際上是一個包裝後的Connection對象,不用說也知道這個包裝的Connection對象確定覆寫了close方法,以使咱們在釋放資源時能將鏈接從新啊返回到DBCP的鏈接池中。