1.JDBC數據庫鏈接池的必要性java
在使用開發基於數據庫的web程序時,傳統的模式基本是按如下步驟: mysql
在主程序(如servlet、beans)中創建數據庫鏈接。web
進行sql操做sql
斷開數據庫鏈接。數據庫
這種模式開發,存在的問題:服務器
普通的JDBC數據庫鏈接使用 DriverManager 來獲取,每次向數據庫創建鏈接的時候都要將 Connection 加載到內存中,再驗證用戶名和密碼(得花費0.05s~1s的時間)。須要數據庫鏈接的時候,就向數據庫要求一個,執行完成後再斷開鏈接。這樣的方式將會消耗大量的資源和時間。數據庫的鏈接資源並無獲得很好的重複利用.若同時有幾百人甚至幾千人在線,頻繁的進行數據庫鏈接操做將佔用不少的系統資源,嚴重的甚至會形成服務器的崩潰。性能
對於每一次數據庫鏈接,使用完後都得斷開。不然,若是程序出現異常而未能關閉,將會致使數據庫系統中的內存泄漏,最終將致使重啓數據庫。大數據
這種開發不能控制被建立的鏈接對象數,系統資源會被毫無顧及的分配出去,如鏈接過多,也可能致使內存泄漏,服務器崩潰.url
2.數據庫鏈接池(connection pool)對象
爲解決傳統開發中的數據庫鏈接問題,能夠採用數據庫鏈接池技術。
數據庫鏈接池的基本思想就是爲數據庫鏈接創建一個「緩衝池」。預先在緩衝池中放入必定數量的鏈接,當須要創建數據庫鏈接時,只需從「緩衝池」中取出一個,使用完畢以後再放回去。
數據庫鏈接池負責分配、管理和釋放數據庫鏈接,它容許應用程序重複使用一個現有的數據庫鏈接,而不是從新創建一個。
數據庫鏈接池在初始化時將建立必定數量的數據庫鏈接放到鏈接池中,這些數據庫鏈接的數量是由最小數據庫鏈接數來設定的。不管這些數據庫鏈接是否被使用,鏈接池都將一直保證至少擁有這麼多的鏈接數量。鏈接池的最大數據庫鏈接數量限定了這個鏈接池能佔有的最大鏈接數,當應用程序向鏈接池請求的鏈接數超過最大鏈接數量時,這些請求將被加入到等待隊列中。
3.數據庫鏈接池技術的優勢
(1)資源重用:因爲數據庫鏈接得以重用,避免了頻繁建立,釋放鏈接引發的大量性能開銷。在減小系統消耗的基礎上,另外一方面也增長了系統運行環境的平穩性。
(2)更快的系統反應速度:數據庫鏈接池在初始化過程當中,每每已經建立了若干數據庫鏈接置於鏈接池中備用。此時鏈接的初始化工做均已完成。對於業務請求處理而言,直接利用現有可用鏈接避免了數據庫鏈接初始化和釋放過程的時間開銷,從而減小了系統的響應時間
(3)新的資源分配手段對於多應用共享同一數據庫的系統而言,可在應用層經過數據庫鏈接池的配置實現某一應用最大可用數據庫鏈接數的限制避免某一應用獨佔全部的數據庫資源.
(4)統一的鏈接管理,避免數據庫鏈接泄露在較爲完善的數據庫鏈接池實現中,可根據預先的佔用超時設定,強制回收被佔用鏈接,從而避免了常規數據庫鏈接操做中可能出現的資源泄露
4.兩種開源的數據庫鏈接池:
(1):JDBC 的數據庫鏈接池使用 javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口一般由服務器(Weblogic, WebSphere, Tomcat)提供實現。
(2):DBCP 數據庫鏈接池是 Apache 軟件基金組織下的開源鏈接池實現, 該鏈接池依賴該組織下的另外一個開源系統:Common-pool. 如需使用該鏈接池實現,應在系統中增長以下兩個 jar 文件:Commons-dbcp.jar:鏈接池的實現 Commons-pool.jar:鏈接池依賴庫
(5)DBCP鏈接池使用的兩種形式
(1):直接設置參數的形式:
//建立數據源對象
BasicDataSource bds = new BasicDataSource();
//設置鏈接數據庫的驅動
bds.setDriverClassName("com.mysql.jdbc.Driver");
//設置鏈接數據庫的url
bds.setUrl("jdbc:mysql://localhost:3306/test");
//設置鏈接數據庫的用戶名
bds.setUsername("root");
//設置鏈接數據庫的密碼
bds.setPassword("root");
//設置鏈接池啓動時的初始值
bds.setInitialSize(5);
//設置鏈接池的最大值
bds.setMaxActive(50);
//最大空閒值.當通過一個高峯時間後,鏈接池能夠慢慢將已經
//用不到的鏈接慢慢釋放一部分,一直減小到maxIdle爲止
bds.setMaxIdle(20);
//最小空閒值.當空閒的鏈接數少於該值時,鏈接池就會預申請一些鏈接,
//以免洪峯來時再申請而形成的性能開銷
bds.setMinIdle(5);
獲得鏈接:Connection conn = dbs.getConnection();
……..
(2):讀取配置文件(properties)的方式。
//構建properties對象
Properties properties = new Properties();
//加載配置文件
properties.load(inputSream);
//BasicDataSourceFactory利用屬性文件的信息建立BasicDataSource數據源
dataSource=BasicDataSourceFactory.createDataSource(properties);
//獲取鏈接
Connection conn = dataSource.getConnection();
配置文件內容形式以下(注意key嚴格遵循大小寫):
#鏈接字符串
url=jdbc:mysql://localhost:3306/test
#用戶名
username=root
#密碼
password=root
#驅動的類路徑
driverClassName=com.mysql.jdbc.Driver
#鏈接池啓動時的初始值
initialSize=1
#鏈接池的最大值
maxActive=50
#最大空閒數
maxIdle=20
#最小空閒數
minIdle=5