Java使用獨立數據庫連接池(DBCP為例)


目前,絕大多數的軟件系統都會使用數據庫,而在軟件構建起來之后,訪問數據庫又成為軟件系統性能的短板(I/O操作)。一般來說一次訪問數據庫就需要一個數據庫連接。而每次創建數據庫連接都需要訪問,分配空閑資源,占用資源,釋放資源,結束訪問。非常的耗費時間和空間。 

於是數據連接池技術便產生了,其原理就是在數據請求方和數據庫之間建立一個數據庫連接管理層。在系統啟動的時候就分配一定數量的連接,並維護這些連接,保持最低數量的連接數。同時為了保護數據庫和系統,設置一個最大連接數,緩解數據庫的訪問壓力。 

這樣在每次數據請求方需要連接時,管理器便分配一個連接給數據請求方,數據請求方使用完連接后,將連接歸還給管理器,這樣就盡可能的減少不必要的數據庫連接消耗。 

在Java的數據庫服務JDBC中並沒有提供一個實際ConnectionPool實現,但是留出了接口以支持第三方服務提供商,我覺得其中最重要的接口是DataSource。 

實際上Java訪問數據庫的方式主要有四種: 
一、使用DriverMananger來直接編程實現,這種是最基本的方式。 
DriverMananger實現數據庫連接的關鍵步驟為: 
1>Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance(); 
2>Connection conn = null; 
3>conn = DriverManager.getConnection(url, "name", "password"); 

二、使用服務器配置文件來實現連接池。 
一些服務器提供了自己的數據庫連接池服務,例如Tomcat服務器就提供了由commons-DBCP支持的數據池連接服務,只需要在context.xml中填寫相應的數值就可以了。 

三、配置文件配置 datasource 
DataSource是在JavaAPI中提供的一個接口,第三方服務在實現了DataSource之后,例如DBCP的BasicDataSource,為了提高數據庫連接池的可配置性,便利用IOC模式(控制反轉),將實際的Bean與配置數據分開,配置數據放在配置文件中(一般使用XML)。來實現對多個數據庫的控制。 

而在DataSource對象實例化之后,通過DataSource.getConnection()就可以得到連接了。 

四、通過配置jdbc-odbc連接橋 
聽說過,沒有使用過,沒有發言權。 

在這里使用Apache提供的commons-DBCP來實現一個獨立的簡單的數據庫連接池。 

首先需要三個工具包:commons-pool.jar,commons-collection.jar,commons-DBCP.jar。 

關鍵實現代碼段見下: 
Java代碼   收藏代碼
  1. //持有一個靜態的數據庫連接池對象  
  2. private static DataSource DS;  
  3.   
  4.   
  5. //使用DBCP提供的BasicDataSource實現DataSource接口  
  6. public static void initDataSource(String connectURI, String username,  
  7.             String password, String driverClass, int initialSize,  
  8.             int maxActive, int maxIdle, int maxWait) {  
  9.                   BasicDataSource ds = new BasicDataSource();  
  10.         ds.setDriverClassName(driverClass);  
  11.         ds.setUsername(username);  
  12.         ds.setPassword(password);  
  13.         ds.setUrl(connectURI);  
  14.         ds.setInitialSize(initialSize);  
  15.         ds.setMaxActive(maxActive);  
  16.         ds.setMaxIdle(maxIdle);  
  17.         ds.setMaxWait(maxWait);  
  18.         DS = ds;  
  19.     }  
  20. //獲得一個數據庫連接  
  21. public Connection getConnection() {  
  22.   
  23.         Connection con = null;  
  24.         if (DS != null) {  
  25.             try {  
  26.                 con = DS.getConnection();  
  27.             } catch (Exception e) {  
  28.                 System.out.println(e.getMessage());         }  
  29.                            //將數據庫連接的事物設置為不默認為自動Commit  
  30.             try {  
  31.                 con.setAutoCommit(false);  
  32.             } catch (SQLException e) {  
  33.                 System.out.println(e.getMessage());         }  
  34.             return con;  
  35.         }  
  36.                   //回收數據庫連接時,直接使用con.close()即可  
  37.         return con;  
  38.   
  39.     }  
  40.   
  41. //回收數據庫連接  
  42.     protected static void shutdownDataSource() throws SQLException {  
  43.         BasicDataSource bds = (BasicDataSource) DS;  
  44.         bds.close();  
  45.     }  


上面的代碼都是從實際使用的代碼抽取出來的,希望可以幫助大家。 

目前,OpenSource中提供了很多的數據庫連接池技術,使用的流程和模式,都與上面的代碼大同小異。同時最新發布的BoneCP我還從來沒有感受過,希望有朋友與我分享一下使用經驗。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM