JDBC例子3_連線池
JDBC連線池
1 連線池介紹
1.1 概述
為解決傳統開發中的資料庫連線耗費資源和時間很多的問題,可以採用資料庫連線池技術,提高效能。
1.2 連線池的工作原理
資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連線,當需要建立資料庫連線時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。
資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是重新建立一個。
資料庫連線池在初始化時將建立一定數量的資料庫連線放到連線池中,這些資料庫連線的數量是由最小資料庫連線數來設定的。無論這些資料庫連線是否被使用,連線池都將一直保證至少擁有這麼多的連線數量。
連線池的最大資料庫連線數量限定了這個連線池能佔有的最大連線數,當應用程式向連線池請求的連線數超過最大連線數量時,這些請求將被加入到等待佇列中。
1.3 資料庫連線池技術的優點
資源重用:
由於資料庫連線得以重用,避免了頻繁建立,釋放連線引起的大量效能開銷。在減少系統消耗的基礎上,另一方面也增加了系統執行環境的平穩性。
更快的系統反應速度
資料庫連線池在初始化過程中,往往已經建立了若干資料庫連線置於連線池中備用。此時連線的初始化工作均已完成。對於業務請求處理而言,直接利用現有可用連線,避免了資料庫連線初始化和釋放過程的時間開銷,從而減少了系統的響應時間
新的資源分配手段
對於多應用共享同一資料庫的系統而言,可在應用層通過資料庫連線池的配置,實現某一應用最大可用資料庫連線數的限制,避免某一應用獨佔所有的資料庫資源
統一的連線管理,避免資料庫連線洩露
在較為完善的資料庫連線池實現中,可根據預先的佔用超時設定,強制回收被佔用連線,從而避免了常規資料庫連線操作中可能出現的資源洩露
1.4 連線池的實現
Java為資料庫連線池提供了公共的介面:javax.sql.DataSource,各個廠商需要讓自己的連線池實現這個介面。這樣應用程式可以方便的切換不同廠商的連線池!
常見的連線池:DBCP、C3P0。
2 常用的資料來源配置
2.1 C3P0連線池
C3P0開源免費的連線池!目前使用它的開源專案有:Spring、Hibernate等。
使用第三方工具需要匯入jar包,c3p0使用時還需要新增配置檔案
c3p0-config.xml
使用步驟:
1、新增jar包
c3p0-0.9.1.2.jar
mchange-commons-java-0.2.11.jar
2、編寫配置檔案
c3p0-config.xml,放在src中(注:檔名一定不要寫錯)
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=utf8
</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">neapadmin</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
</c3p0-config>
核心程式碼:
private static DataSource ds=new ComboPooledDataSource();
使用配置檔案,建立c3p0連線 Datasurce物件。
通過dataSource.getConnection(),可以獲取連線物件。
注: DataSource物件,整個專案只要一個就可以了,不要建立多個。
注意:jdbcurl在寫的時候指定編碼格式,但是在xml檔案下,需要使用轉義符;
參照:https://blog.csdn.net/xdqkid/article/details/53708657
- 寫完之後,檢測是否連線到了資料庫
package util;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
static private DataSource ds=new ComboPooledDataSource();
public static DataSource getDataSource() {
return ds;
}
static public Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
package util;
import java.sql.Connection;
import java.sql.SQLException;
public class Testapp {
public static void main(String[] args) throws SQLException {
Connection conn=C3P0Utils.getConnection();
if(conn==null) {
System.out.println("資料庫連線失敗");
}else {
System.out.println("success");
}
}
}