JDBC_dbcp數據庫鏈接池java
1.數據庫鏈接池概述mysql
(1).傳統的數據庫操做
普通的JDBC數據庫鏈接使用 DriverManager 來獲取,每次向數據庫創建鏈接的時候都要將 Connection 加載到內存中,再驗證用戶名和密碼(
得花費0.05s~1s的時間)。須要數據庫鏈接的時候,就向數據庫要求一個,執行完成後再斷開鏈接。這樣的方式將會消耗大量的資源和時間。
數據庫的鏈接資源並無獲得很好的重複利用.若同時有幾百人甚至幾千人在線,頻繁的進行數據庫鏈接操做將佔用不少的系統資源,嚴重的
甚至會形成服務器的崩潰。
對於每一次數據庫鏈接,使用完後都得斷開。不然,若是程序出現異常而未能關閉,將會致使數據庫系統中的內存泄漏,最終將致使重啓數據庫。
這種開發不能控制被建立的鏈接對象數,系統資源會被毫無顧及的分配出去,如鏈接過多,也可能致使內存泄漏,服務器崩潰。 sql
(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
大數據