目前,絕大多數的軟件系統都會使用數據庫,而在軟件構建起來之后,訪問數據庫又成為軟件系統性能的短板(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。
關鍵實現代碼段見下:
上面的代碼都是從實際使用的代碼抽取出來的,希望可以幫助大家。
目前,OpenSource中提供了很多的數據庫連接池技術,使用的流程和模式,都與上面的代碼大同小異。同時最新發布的BoneCP我還從來沒有感受過,希望有朋友與我分享一下使用經驗。
於是數據連接池技術便產生了,其原理就是在數據請求方和數據庫之間建立一個數據庫連接管理層。在系統啟動的時候就分配一定數量的連接,並維護這些連接,保持最低數量的連接數。同時為了保護數據庫和系統,設置一個最大連接數,緩解數據庫的訪問壓力。
這樣在每次數據請求方需要連接時,管理器便分配一個連接給數據請求方,數據請求方使用完連接后,將連接歸還給管理器,這樣就盡可能的減少不必要的數據庫連接消耗。
在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。
關鍵實現代碼段見下:
- //持有一個靜態的數據庫連接池對象
- private static DataSource DS;
- //使用DBCP提供的BasicDataSource實現DataSource接口
- public static void initDataSource(String connectURI, String username,
- String password, String driverClass, int initialSize,
- int maxActive, int maxIdle, int maxWait) {
- BasicDataSource ds = new BasicDataSource();
- ds.setDriverClassName(driverClass);
- ds.setUsername(username);
- ds.setPassword(password);
- ds.setUrl(connectURI);
- ds.setInitialSize(initialSize);
- ds.setMaxActive(maxActive);
- ds.setMaxIdle(maxIdle);
- ds.setMaxWait(maxWait);
- DS = ds;
- }
- //獲得一個數據庫連接
- public Connection getConnection() {
- Connection con = null;
- if (DS != null) {
- try {
- con = DS.getConnection();
- } catch (Exception e) {
- System.out.println(e.getMessage()); }
- //將數據庫連接的事物設置為不默認為自動Commit
- try {
- con.setAutoCommit(false);
- } catch (SQLException e) {
- System.out.println(e.getMessage()); }
- return con;
- }
- //回收數據庫連接時,直接使用con.close()即可
- return con;
- }
- //回收數據庫連接
- protected static void shutdownDataSource() throws SQLException {
- BasicDataSource bds = (BasicDataSource) DS;
- bds.close();
- }
上面的代碼都是從實際使用的代碼抽取出來的,希望可以幫助大家。
目前,OpenSource中提供了很多的數據庫連接池技術,使用的流程和模式,都與上面的代碼大同小異。同時最新發布的BoneCP我還從來沒有感受過,希望有朋友與我分享一下使用經驗。