筆者對於數據庫連接池也是初學,寫這篇文章的主要目的是方便自己去理解數據庫連接池的相關內容,所以有些描述並不是那麼專業和全面,請多多包涵。
一、數據庫連接池概述
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的數據庫連接來避免因爲沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。
數據庫連接池就是一個容器,裏面存放着許多數據庫連接。當用戶訪問數據庫時,便從數據庫連接池裏面尋找相應的數據庫連接,當用戶使用完成後,便歸還數據庫連接。
使用數據庫連接池可以節約資源,並且是用戶的訪問更高效,因爲不用重複創建數據庫連接。
二、數據庫連接池的使用
目前主流的數據庫連接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等等,關於它們之間的比較可以參考大佬的博客主流Java數據庫連接池比較與開發配置實戰。具體選用哪一種可根據實際情況來,推薦Druid和DBCP。
Druid的使用
Druid是阿里巴巴開源平臺上一個數據庫連接池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日誌監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池。
使用Druid,首先得下載並導入相應的jar包,druid下載。在導入jar包後要進行相應的配置,配置方法可參考大佬的博客Druid(德魯伊)數據池配置文件詳解以及簡單的實現,建議採用配置文件的方法。然後就是加載配置文件(配置文件可放在項目的任意目錄下)。
完成上面的準備工作後,就可以根據DruidDataSourceFactory獲取數據庫連接池對象,然後再通過getConnection獲取數據庫連接。具體實現,見下面代碼:
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
public class DruidTest {
public static void main(String[] args) throws Exception {
//加載配置文件
Properties properties = new Properties();
InputStream inputStream =
DruidTest.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(inputStream);
//獲取連接池對象
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//獲取連接
Connection connection = dataSource.getConnection();
//輸出,測試一下
System.out.println(connection);
}
}
也可以構造一個druid工具類以簡化操作,避免在不同的類裏面每次都要寫實現druid的相關代碼。druid工具類代碼如下所示:
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* druid連接池工具類
*/
public class JDBCUtils {
private static DataSource dataSource;
static {
//加載配置文件
Properties properties = new Properties();
InputStream inputStream =
JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
try {
properties.load(inputStream);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//獲取連接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//釋放資源
public static void close(Statement statement, Connection connection) throws SQLException {
close(null, statement, connection);
}
//釋放資源
public static void close(ResultSet resultSet, Statement statement, Connection connection)
throws SQLException {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
//注意這裏是歸還數據庫連接,而不是關閉
connection.close();
}
}
//獲取連接池
public static DataSource getDataSource() {
return dataSource;
}
}
以後再使用druid時,只需調用改工具類的相關方法即可,很方便。
2019.12.22