JDBC資料庫連接池
- 一、JDBC資料庫連接池的必要性
- 二、資料庫連接池技術
- 三、多種開源的資料庫連接池
- 3.1 C3P0資料庫連接池
- 3.2 DBCP資料庫連接池
- 3.3 Druid(德魯伊)資料庫連接池
一、JDBC資料庫連接池的必要性
1、在使用開發基于資料庫的web程式時,傳統的模式基本是按以下步驟:
(1)在主程式(如servlet、beans)中建立資料庫連接
(2)進行sql操作
(3)斷開資料庫連接
2、這種模式開發,存在的問題:
(1)普通的JDBC資料庫連接使用 DriverManager 來獲取,每次向資料庫建立連接的時候都要將 Connection加載到記憶體中,再驗證用戶名和密碼(得花費0.05s~1s的時間),需要資料庫連接的時候,就向資料庫要求一個,執行完成后再斷開連接,這樣的方式將
會消耗大量的資源和時間,資料庫的連接資源并沒有得到很好的重復利用,若同時有幾百人甚至幾千人在線,頻繁的進行資料庫連接操作將占用很多的系統資源,嚴重的甚至會造成服務器的崩潰,
(2)對于每一次資料庫連接,使用完后都得斷開,否則,如果程式出現例外而未能關閉,將會導致資料庫系統中的記憶體泄漏,最終將導致重啟資料庫,(回憶:何為Java的記憶體泄漏?)
(3)這種開發不能控制被創建的連接物件數,系統資源會被毫無顧及的分配出去,如連接過多,也可能導致記憶體泄漏,服務器崩潰,LIK1
二、資料庫連接池技術
為解決傳統開發中的資料庫連接問題,可以采用資料庫連接池技術,
1、資料庫連接池的基本思想:
就是為資料庫連接建立一個“緩沖池”,預先在緩沖池中放入一定數量的連接,當需要建立資料庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去,
資料庫連接池負責分配、管理和釋放資料庫連接,它允許應用程式重復使用一個現有的資料庫連接,而不是重新建立一個,
資料庫連接池在初始化時將創建一定數量的資料庫連接放到連接池中,這些資料庫連接的數量是由最小資料庫連接數來設定的,無論這些資料庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量,連接池的最大資料庫連接數量限定了這個連接池能占有的最大連接數,當應用程式向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待佇列中,

2、資料庫連接池的作業原理:

3、資料庫連接池技術的優點:
(1)資源重用
由于資料庫連接得以重用,避免了頻繁創建,釋放連接引起的大量性能開銷,在減少系統消耗的基礎上,另一方面也增加了系統運行環境的平穩性,
(2)更快的系統反應速度
資料庫連接池在初始化程序中,往往已經創建了若干資料庫連接置于連接池中備用,此時連接的初始化作業均已完成,對于業務請求處理而言,直接利用現有可用連接,避免了資料庫連接初始化和釋放程序的時間開銷,從而減少了系統的回應時間
(3)新的資源分配手段
對于多應用共享同一資料庫的系統而言,可在應用層通過資料庫連接池的配置,實作某一應用最大可用資料庫連接數的限制,避免某一應用獨占所有的資料庫資源
(4)統一的連接管理,避免資料庫連接泄漏
在較為完善的資料庫連接池實作中,可根據預先的占用超時設定,強制回收被占用連接,從而避免了常規資料庫連接操作中可能出現的資源泄露,LIK2
三、多種開源的資料庫連接池
1、JDBC 的資料庫連接池使用 javax.sql.DataSource 來表示,DataSource 只是一個介面,該介面通常由服務器(Weblogic, WebSphere, Tomcat)提供實作,也有一些開源組織提供實作:
(1)DBCP 是Apache提供的資料庫連接池,tomcat服務器自帶dbcp資料庫連接池,速度相對c3p0較快,但因自身存在BUG,Hibernate3已不再提供支持,
(2)C3P0 是一個開源組織提供的一個資料庫連接池,速度相對較慢,穩定性還可以,hibernate官方推薦使用,
(3)Proxool 是sourceforge下的一個開源專案資料庫連接池,有監控連接池狀態的功能,穩定性較c3p0差一點.
(4)BoneCP 是一個開源組織提供的資料庫連接池,速度快,
(5)Druid 是阿里提供的資料庫連接池,據說是集DBCP 、C3P0 、Proxool優點于一身的資料庫連接池,但是速度不確定是否有BoneCP快,
2、DataSource 通常被稱為資料源,它包含連接池和連接池管理兩個部分,習慣上也經常把 DataSource 稱為連接池
3、DataSource用來取代DriverManager來獲取Connection,獲取速度快,同時可以大幅度提高資料庫訪問速度,
特別注意:
(1)資料源和資料庫連接不同,
資料源無需創建多個,它是產生資料庫連接的工廠,因此整個應用只需要一個資料源即可,
(2)當資料庫訪問結束后,程式還是像以前一樣關閉資料庫連接:conn.close();
但conn.close()并沒有關閉資料庫的物理連接,它僅僅把資料庫連接釋放,歸還給了資料庫連接池,LIK3
3.1 C3P0資料庫連接池
(1)獲取連接的方式一:
//使用C3P0資料庫連接池的方式,獲取資料庫的連接:不推薦
public static Connection getConnection1() throws Exception{
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
cpds.setUser("root");
cpds.setPassword("abc123");
// cpds.setMaxPoolSize(100);
Connection conn = cpds.getConnection();
return conn;
}
(2)獲取連接的方式二:
//使用C3P0資料庫連接池的組態檔方式,獲取資料庫的連接:推薦
private static DataSource cpds = new ComboPooledDataSource("helloc3p0");
public static Connection getConnection2() throws SQLException{
Connection conn = cpds.getConnection();
return conn;
}
其中,src下的組態檔為:(c3p0-config.xml)
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <named-config name="helloc3p0"> <!-- 獲取連接的4個基本資訊 --> <property name="user">root</property> <property name="password">abc123</property> <property name="jdbcUrl">jdbc:mysql:///test</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <!-- 涉及到資料庫連接池的管理的相關屬性的設定 --> <!-- 若資料庫中連接數不足時, 一次向資料庫服務器申請多少個連接 --> <property name="acquireIncrement">5</property> <!-- 初始化資料庫連接池時連接的數量 --> <property name="initialPoolSize">5</property> <!-- 資料庫連接池中的最小的資料庫連接數 --> <property name="minPoolSize">5</property> <!-- 資料庫連接池中的最大的資料庫連接數 --> <property name="maxPoolSize">10</property> <!-- C3P0 資料庫連接池可以維護的 Statement 的個數 --> <property name="maxStatements">20</property> <!-- 每個連接同時可以使用的 Statement 物件的個數 --> <property name="maxStatementsPerConnection">5</property> </named-config> </c3p0-config>LIK4
3.2 DBCP資料庫連接池
1、DBCP 是 Apache 軟體基金組織下的開源連接池實作,該連接池依賴該組織下的另一個開源系統:Common-pool,如需使用該連接池實作,應在系統中增加如下兩個 jar 檔案:
Commons-dbcp.jar:連接池的實作
Commons-pool.jar:連接池實作的依賴庫
2、Tomcat 的連接池正是采用該連接池來實作的,該資料庫連接池既可以與應用服務器整合使用,也可由應用程式獨立使用,
3、資料源和資料庫連接不同,資料源無需創建多個,它是產生資料庫連接的工廠,因此整個應用只需要一個資料源即可,
4、當資料庫訪問結束后,程式還是像以前一樣關閉資料庫連接:conn.close(); 但上面的代碼并沒有關閉資料庫的物理連接,它僅僅把資料庫連接釋放,歸還給了資料庫連接池,
配置屬性說明:

(1)獲取連接方式一:
public static Connection getConnection3() throws Exception {
BasicDataSource source = new BasicDataSource();
source.setDriverClassName("com.mysql.jdbc.Driver");
source.setUrl("jdbc:mysql:///test");
source.setUsername("root");
source.setPassword("abc123");
//
source.setInitialSize(10);
Connection conn = source.getConnection();
return conn;
}
(2)獲取連接方式二:
//使用dbcp資料庫連接池的組態檔方式,獲取資料庫的連接:推薦
private static DataSource source = null;
static{
try {
Properties pros = new Properties();
InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
pros.load(is);
//根據提供的BasicDataSourceFactory創建對應的DataSource物件
source = BasicDataSourceFactory.createDataSource(pros);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection4() throws Exception {
Connection conn = source.getConnection();
return conn;
}
其中,src下的組態檔為:(dbcp.properties)
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&useServerPrepStmts=false username=root password=abc123 initialSize=10 #...LIK5
3.3 Druid(德魯伊)資料庫連接池
Druid是阿里巴巴開源平臺上一個資料庫連接池實作,它結合了C3P0、DBCP、Proxool等DB池的優點,同時加入了日志監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池,可以說是目前最好的連接池之一,
import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class TestDruid {
public static void main(String[] args) throws Exception {
Properties pro = new Properties(); pro.load(TestDruid.class.getClassLoader().getResourceAsStream("druid.properties"));
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
其中,src下的組態檔為:(druid.properties)
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver
initialSize=10
maxActive=20
maxWait=1000
filters=wall
詳細引數配置:


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147648.html
標籤:Java
上一篇:Java集合-Map
