1. 程式人生 > >javaWeb_JDBC_數據庫連接池概述以及dbcp連接池

javaWeb_JDBC_數據庫連接池概述以及dbcp連接池

ins dbcp 數據庫 方式 jar 單位 開源 要求 大量 dex


JDBC_dbcp數據庫連接池

1.數據庫連接池概述

(1).傳統的數據庫操作

普通的JDBC數據庫連接使用 DriverManager 來獲取,每次向數據庫建立連接的時候都要將 Connection 加載到內存中,再驗證用戶名和密碼(
得花費0.05s~1s的時間)。需要數據庫連接的時候,就向數據庫要求一個,執行完成後再斷開連接。這樣的方式將會消耗大量的資源和時間。
數據庫的連接資源並沒有得到很好的重復利用.若同時有幾百人甚至幾千人在線,頻繁的進行數據庫連接操作將占用很多的系統資源,嚴重的
甚至會造成服務器的崩潰。
對於每一次數據庫連接,使用完後都得斷開。否則,如果程序出現異常而未能關閉,將會導致數據庫系統中的內存泄漏,最終將導致重啟數據庫。
這種開發不能控制被創建的連接對象數,系統資源會被毫無顧及的分配出去,如連接過多,也可能導致內存泄漏,服務器崩潰。

(2).數據庫連接池

為解決傳統開發中的數據庫連接問題,可以采用數據庫連接池技術。
數據庫連接池的基本思想就是為數據庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,
只需從“緩沖池”中取出一個,使用完畢之後再放回去。
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是重新建立一個。
數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據
庫連接是否被使用,連接池都將一直保證至少擁有這麽多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,
當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。

(3).數據庫連接池的優點
A:資源重用:
由於數據庫連接得以重用,避免了頻繁創建,釋放連接引起的大量性能開銷。在減少系統消耗的基礎上,另一方面也增加了系統運行環境的
平穩性。
B:更快的系統反應速度
數據庫連接池在初始化過程中,往往已經創建了若幹數據庫連接置於連接池中備用。此時連接的初始化工作均已完成。對於業務請求處理而
言,直接利用現有可用連接,避免了數據庫連接初始化和釋放過程的時間開銷,從而減少了系統的響應時間
C:新的資源分配手段
對於多應用共享同一數據庫的系統而言,可在應用層通過數據庫連接池的配置,實現某一應用最大可用數據庫連接數的限制,避免某一應用
獨占所有的數據庫資源
D:統一的連接管理,避免數據庫連接泄露
在較為完善的數據庫連接池實現中,可根據預先的占用超時設定,強制回收被占用連接,從而避免了常規數據庫連接操作中可能出現的資源
泄露


2.倆種常見的數據庫連接池
JDBC 的數據庫連接池使用 javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口通常由服務器(Weblogic, WebSphere, Tomcat)
提供實現,也有一些開源組織提供實現:
DBCP 數據庫連接池
C3P0 數據庫連接池
DataSource 通常被稱為數據源,它包含連接池和連接池管理兩個部分,習慣上也經常把 DataSource 稱為連接池


3.dbcp數據庫連接池

(1).dbcp數據庫連接池基本使用步驟:
A. 加入 jar 包(2 個jar 包). 依賴於 Commons-Pool-1.5.5.jar,commons-dbcp-1.4.jar
B. 創建數據庫連接池
C. 為數據源實例指定必須的屬性,也可以指定一些屬性
D. 從數據源中獲取數據庫連接

(2).一個基本的dbcp數據庫連接池代碼

/**
* 使用 DBCP 數據庫連接池
* 1. 加入 jar 包(2 個jar 包). 依賴於 Commons Pool
* 2. 創建數據庫連接池
* 3. 為數據源實例指定必須的屬性
* 4. 從數據源中獲取數據庫連接
* @throws SQLException
*/
public static void testDBCP() throws SQLException{
final BasicDataSource dataSource = new BasicDataSource();

//2. 為數據源實例指定必須的屬性
dataSource.setUsername("root");
dataSource.setPassword("1230");
dataSource.setUrl("jdbc:mysql:///atguigu");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");

//3. 指定數據源的一些可選的屬性.
//1). 指定數據庫連接池中初始化連接數的個數
dataSource.setInitialSize(5);

//2). 指定最大的連接數: 同一時刻可以同時向數據庫申請的連接數
dataSource.setMaxActive(5);

//3). 指定小連接數: 在數據庫連接池中保存的最少的空閑連接的數量
dataSource.setMinIdle(2);

//4).等待數據庫連接池分配連接的最長時間. 單位為毫秒. 超出該時間將拋出異常.
dataSource.setMaxWait(1000 * 5);

//4. 從數據源中獲取數據庫連接
Connection connection = dataSource.getConnection();
System.out.println(connection.getClass());

connection = dataSource.getConnection();
System.out.println(connection.getClass());

connection = dataSource.getConnection();
System.out.println(connection.getClass());

connection = dataSource.getConnection();
System.out.println(connection.getClass());

Connection connection2 = dataSource.getConnection();
System.out.println(">" + connection2.getClass());

new Thread(){
public void run() {
Connection conn;
try {
conn = dataSource.getConnection();
System.out.println(conn.getClass());
} catch (SQLException e) {
e.printStackTrace();
}
};
}.start();

try {
Thread.sleep(5500);
} catch (InterruptedException e) {
e.printStackTrace();
}

connection2.close();
}


(3).讀取配置文件的dbcp版代碼(工廠模式)

//測試代碼

/**
* 1. 加載 dbcp 的 properties 配置文件: 配置文件中的鍵需要來自 BasicDataSource
* 的屬性.
* 2. 調用 BasicDataSourceFactory 的 createDataSource 方法創建 DataSource
* 實例
* 3. 從 DataSource 實例中獲取數據庫連接.
*/
public void testDBCPWithDataSourceFactory() throws Exception{

Properties properties = new Properties();
InputStream inStream = JDBCTest.class.getClassLoader()
.getResourceAsStream("dbcp.properties");
properties.load(inStream);

DataSource dataSource =
BasicDataSourceFactory.createDataSource(properties);

System.out.println(dataSource.getConnection());

// BasicDataSource basicDataSource =
// (BasicDataSource) dataSource;
//
// System.out.println(basicDataSource.getMaxWait());
}



//配置文件代碼(dbcp.properties)
username=root
password=1230
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test

initialSize=10
maxActive=50
minIdle=5
maxWait=5000

javaWeb_JDBC_數據庫連接池概述以及dbcp連接池