1. 數據庫連接池 簡介
實際開發中“獲得連接”或“釋放資源”是非常消耗系統資源的兩個過程,為了解決此類性能問題,通常情況我們 采用連接池技術,來共享連接Connection。這樣我們就不需要每次都創建連接、釋放連接了,這些操作都交 給了連接池。
如何使用連接池:
Java為數據庫連接池提供了公共的接口:javax.sql.DataSource,各個廠商需要讓自己的連接池實現這個接口。 這樣應用程序可以方便的切換不同的連接池!DBCP、C3P0、Druid 就是幾個常用的連接池。
2. DBCP連接池
2.1 簡介
DBCP是Apache的一個開源的連接池。Tomcat中就內置了該連接池。
2.2 引入方式
1. 下載 JAR 包并導入
首先,從 https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi 下載dbcp連接池,我這里下載的是 commons-dbcp2-2.8.0-bin.zip 解壓后commons-dbcp2-2.8.0.jar就是所需的文件。
然而,DBCP連接池有兩個依賴:commons-logging-1.2-bin.zip 和 commons-pool2-2.9.0-bin.zip 下載后解壓出Jar文件。
獲得 jar 包后開始導入:
在IDEA中導入 jar 包,可以在項目中創建一個文件夾,然后右鍵點擊文件夾,選擇Add as Library
,最后將需要的Jar包(也就是剛剛下載的三個jar包)導入即可。注意:使用了連接池并不會自帶數據庫連接驅動,所以數據庫連接器的 jar 包也要導入。
注意:
不同版本的依賴以不同,如 dbcp-1.4 只需要 pool-1.5.6就可以了。這些也不用記,只需要 先下載dbcp的 jar 包并導入執行程序,程序會報NoClassDefFoundError,意思就是執行時發現需要后邊的類,但找不到。
知道卻什么后就可以從官網:https://commons.apache.org/proper/ 找到并下載對應的東西就可以了。
不得不說,這就逐漸體現出Maven的重要性了。
2.3 使用
DBCP中的BasicDateSource,就是 javax.sql.DateSource接口的實現類,創建其對象,對其進行配置,然后就可以通過這個對象獲取數據庫連接(Connection對象)了。以此來代替通過DriverManager獲取連接對象。
DBCP工具類(使用 setXxx 配置):
public class DBCPUtils {
private DBCPUtils(){}
// 配置的相關信息
public static final String DRIVERCLASS = "com.mysql.cj.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC";
public static final String USERNAME = "root";
public static final String PASSWORD = "123456";
private static BasicDataSource ds;
static {
// 代碼配置法
ds = new BasicDataSource();
ds.setDriverClassName(DRIVERCLASS); // 配置 驅動器名
ds.setUrl(URL); // 配置 數據庫地址
ds.setUsername(USERNAME); // 配置 數據庫登錄用戶名
ds.setPassword(PASSWORD); // 配置 數據庫登錄密碼
ds.setMaxTotal(20); // 相當于DBCP1中的maxActive,表示最多有20條連接 默認:8
ds.setMaxIdle(10); // 最大空閑連接數 默認:8
ds.setMinIdle(5); // 最小空閑連接數 默認:0
ds.setInitialSize(8); // 連接池啟動時創建的初始化連接數量 默認:0
// 注意: setConnectionProperties()方法要求傳入以分號分割的配置信息字符串,然而測試寫在此處并沒有什么用
// 所以:使用配置文件時,還是用 工廠類 的方法創建
}
// 獲取連接的方法
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 歸還連接的方法
public static void close(AutoCloseable c){
if(null!=c){
try {
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
DBCP工具類(使用 properties文件 配置):
public class DBCPUtils {
private DBCPUtils(){}
// 配置文件 的 資源路徑 推薦使用配置文件,耦合性低,符合開閉原則
public static final String path = "/dbcp.properties";
private static BasicDataSource ds;
static {
// 使用Properties配置文件
Properties p = new Properties();
InputStream in = DBCPUtils.class.getResourceAsStream(path);
try {
p.load(in);
ds = BasicDataSourceFactory.createDataSource(p); // 工廠方法創建數據源
} catch (Exception e) {
e.printStackTrace();
}
}
// 獲取連接的方法
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 歸還連接的方法
public static void close(AutoCloseable c){
if(null!=c){
try {
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
jdbc.properties 文件,放置在src或resource目錄下:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC
username=root
password=123456
maxTotal=20
maxIdle=10
minIdle=5
initialSize=8
3. C3P0連接池
3.1 簡介
C3P0是一個開源的JDBC連接池,支持JDBC3規范和JDBC2的標準擴展。目前使用它的開源項目有Hibernate、 Spring等。
3.2 導入 jar 包
下載網址:https://sourceforge.net/projects/c3p0/
下載后將其中 lib 目錄下的三個 jar 包全部導入即可:
3.3 C3P0配置
1. 基于 setXxx 配置
public static ComboPooledDataSource ds;
static {
ds = new ComboPooledDataSource();
try {
ds.setDriverClass("com.mysql.cj.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC");
ds.setUser("root");
ds.setPassword("123456");
ds.setInitialPoolSize(3);
ds.setMaxPoolSize(10);
ds.setMinPoolSize(3);
ds.setAcquireIncrement(3);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
2. 使用配置文件
配置文件名稱必須為:c3p0-config.xml 內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--默認配置-->
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- initialPoolSize:初始化時獲取三個連接,
取值應在minPoolSize與maxPoolSize之間。 -->
<property name="initialPoolSize">3</property>
<!-- maxIdleTime:最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。-->
<property name="maxIdleTime">60</property>
<!-- maxPoolSize:連接池中保留的最大連接數 -->
<property name="maxPoolSize">100</property>
<!-- minPoolSize: 連接池中保留的最小連接數 -->
<property name="minPoolSize">10</property>
</default-config>
<!--配置連接池mysql-->
<named-config name="mysql">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</named-config>
<!--配置連接池2,可以配置多個-->
</c3p0-config>
注意: jdbcUrl中有多個參數時使用&連接,但XML文件中&是轉義字符,&amp; 才表示 & 字符。
使用:
public static ComboPooledDataSource ds = new ComboPooledDataSource("mysql");
// 這里的 mysql 是配置文件中 named-config 的 name 屬性給定的值。
// 不寫參數時表示使用默認配置<default-config>
3. 常用配置參數
參數
含義
driverClass
數據庫驅動類
jdbcUrl
數據庫連接地址
user
登錄 用戶名
password
用戶 密碼
initialPoolSize
初始化連接數,取值應在minPoolSize與maxPoolSize之間。 默認: 3
maxIdleTime
最大空閑時間,多少秒內未使用則連接被丟棄。若為0則永不丟棄。 默認: 0
maxPoolSize
最大連接數 默認:15
minPoolSize
最小連接數 默認:10
目前還沒有經歷過需要配置這些的場景,不好深究,等用到了再說吧。
https://blog.csdn.net/zhanghanlun/article/details/80918422
4. Druid連接池
4.1 簡介
Druid(德魯伊)是阿里巴巴開發的號稱為監控而生的數據庫連接池,Druid是目前最好的數據庫連接池。在功 能、性能、擴展性方面,都超過其他數據庫連接池,同時加入了日志監控,可以很好的監控DB池連接和SQL的執行 情況。
4.2 導入 jar 包
下載網址:https://repo1.maven.org/maven2/com/alibaba/druid/ 可能會比較慢。
下載對應 jar 包,并導入即可。沒有什么依賴。
4.3 配置使用方式
可以通過properties文件進行配置,與DBCP的配置方式極其相似。
Druid工具類:
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class DruidUtils {
private DruidUtils(){}
private static DataSource ds;
// 創建數據源
static{
InputStream in = DruidDataSource.class.getResourceAsStream("/dbcp.properties");
Properties p = new Properties();
try {
p.load(in);
ds = DruidDataSourceFactory.createDataSource(p);
}catch (Exception e) {
e.printStackTrace();
}
}
// 獲取連接
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 關閉連接
public static void close(AutoCloseable c){
if(null!=c){
try {
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
配置文件:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/lianxi01?characterEncoding=utf-8&serverTimezone=UTC
username=root
password=123456
initialSize=5
maxActive=10
# 不是使用maxIdle,而是想c3p0一樣指定最長等待時間
maxWait=3000