首先要知道數據庫連接(Connection對象)的創建和關閉是非常浪費系統資源的,如果是使用常規的數據庫連接方式來操作數據庫,當用戶變多時,每次訪問數據庫都要創建大量的Connnection對象,使用完成後關閉連接。這一過程頻繁地使用時,會導致程序性能急劇下降。如果項目存在頻繁訪問數據庫的操作,則應該使用數據庫連接池來管理數據庫連接,可以顯著提升程序運行效率。
數據庫連接池原理
數據庫連接池的介紹
DBCP數據源
initialSize
|
|
初始化連接:連接池啓動時創建的連接數量;
|
maxActive
|
|
最大活動連接:連接池在同一時間能夠分配的最大活動連接的數量, 設爲負數表示不限制;
|
maxIdle
|
|
最大空閒連接:連接池中容許保持空閒狀態的最大連接數量,超過的空閒連接將被釋放,設爲負數表示不限制;
|
minIdle
|
|
最小空閒連接:連接池中容許保持空閒狀態的最小連接數量,低於這個數量將創建新的連接,設爲0則不創建;
|
maxWait
|
最大等待時間:當沒有可用連接時,連接池等待連接被歸還的最大時間(以毫秒計數),超過時間則拋出異常,設爲-1表示無限等待。
|
#數據庫驅動包程序
driverClassName=com.mysql.jdbc.Driver
#訪問的數據庫地址 ,高版本Mysql要求使用SSL,這裏改成false,就沒警告了。
url=jdbc:mysql://localhost:3306/testdb?useSSL=false
#數據庫用戶
username=root
#數據庫密碼
password=1234
#初始連接數
initialSize=5
#最大活動連接數
maxActive=10
#最小空閒數
minIdle=3
#超過時長 6s
maxWait=60000
public class DBCPUtils{
private static DataSource ds = null;//數據源只需要一個,設爲static。
//靜態塊只加載一次
static {
try {
InputStream is = new FileInputStream("dbconfig.properties");//加載配置文件
Properties prop = new Properties();
prop.load(is);
//使用DBCP的數據源工廠來創建數據源
ds = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 使用DBCP數據源來獲取數據庫連接
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = ds.getConnection();//從連接池中拿出一個連接
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 關閉資源
*/
public void close(Connection conn, Statement st, ResultSet rs) {
//關閉結果集對象
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//關閉執行SQL語句的Statement對象
if(st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//關閉連接,並非真正關閉,而是返回連接池
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
private static BasicDataSource ds = null;
static {
//創建數據源對象
ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/testdb?useSSL=false");
ds.setUsername("root");
ds.setPassword("1234");
ds.setInitialSize(5);
ds.setMaxActive(25);
ds.setMinIdle(10);
}
C3P0數據源
minPoolSize:連接池保持的最小連接數,default :3
maxPoolSize:連接池中擁有的最大連接數,如果獲得新連接時連接總數超過該值則不再獲取新連接,而是等待其他連接釋放,default :15。
acquireIncrement:連接池在無空閒連接可用時一次性創建的新數據庫連接數,default :3
maxIdleTime:連接的最大空閒時間,如果超過這個時間,某個連接還未被使用,則會斷開這個連接。如果爲0,則永遠不會斷開連接,default : 0 。
idleConnectionTestPeriod:每900秒檢查所有連接池中的空閒連接
配置方式推薦兩種:一是類似上面配置DBCP數據源所採用的屬性文件方式,但C3P0的配置屬性文件名必須爲c3p0.properties,而且屬性名爲c3p0.屬性名,不然沒法解析。最重要的存放路徑一定要對,不然會找不到,從而一直出現異常;二是採用XML配置文件,在類路徑下新建一個c3p0-config.xml文件。
如圖所示,要放在存放類文件的路徑之下,不然找不到。
使用properties方式
#mysql驅動程序
c3p0.driverClass=com.mysql.jdbc.Driver
#數據庫地址。高版本Mysql要求使用SSL,這裏改成false,就沒警告了。
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/testdb?useSSL=false
#用戶
c3p0.user=root
#密碼
c3p0.password=1234
#初始連接數
c3p0.InitialPoolSize = 5
#最大連接數
c3p0.maxPoolSize=20
#最小連接數
c3p0.minPoolSize=5
#連接的最大空閒時間,單位s
c3p0.maxIdleTime=10
#獲得新連接失敗時重試的次數
c3p0.acquireRetryAttempts=30
#連接池獲得新連接時的間隔時間
c3p0.acquireRetryDelay=1000
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默認配置,創建c3p0連接池對象時,沒有指定名字,則使用該配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/testdb?useSSL=false</property>
<property name="user">root</property>
<property name="password">1234</property>
<!-- 省略設置參數,採用默認設定-->
</default-config>
<!-- 命名配置,創建c3p0連接池對象時,指定該名字,則使用該配置 -->
<named-config name="MYSQL">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/testdb?useSSL=false</property>
<property name="user">root</property>
<property name="password">1234</property>
<!-- 設置配置參數 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">25</property>
<property name="minPoolSize">5</property>
<property name="maxIdleTime">60</property> <!-- 連接的最大空閒時間,單位s -->
<property name="acquireRetryAttempts">30</property> <!-- 獲取連接失敗時,重試次數 -->
<property name="acquireRetryDelay">30</property> <!-- 連接池獲得新連接時的間隔時間 -->
</named-config>
</c3p0-config>
c3p0獲取數據庫連接的代碼
public class C3p0Util {
private static ComboPooledDataSource ds =null;
static {
//指定名字,就使用該命名的配置;未指定則使用默認配置。
ds = new ComboPooledDataSource("MYSQL");
}
/**
* 從連接池獲取數據庫連接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//省略關閉資源方法,和上面DBCP數據源的一樣
}