Java 數(shù)據(jù)庫連接池c3p0 介紹
前言:
c3p0 是一個開源的數(shù)據(jù)庫連接池,實(shí)現(xiàn)了 JDBC 3 規(guī)范;本文主要介紹 c3p0 的基本使用,文中使用到的軟件版本:Java 1.8.0_191、c3p0 0.9.5.5、Spring Boot 2.3.12.RELEASE。
1、配置參數(shù)
1.1、基礎(chǔ)配置
配置
| 參數(shù) | 默認(rèn)值 | 描述 |
| driverClass | null | 驅(qū)動類名稱 |
| jdbcUrl | null | jdbc 連接 url |
| user | null | 用戶名 |
| password | null | 密碼 |
1.2、連接池大小
| 參數(shù) | 默認(rèn)值 | 描述 |
| acquireIncrement | 3 | 連接池中的連接耗盡時,一次創(chuàng)建的連接個數(shù) |
| initialPoolSize | 3 | 初始連接池大小,介于?minPoolSize 和 maxPoolSize 之間 |
| maxPoolSize | 15 | 最大連接數(shù) |
| minPoolSize | 3 | 最小連接數(shù) |
1.3、連接池大小和連接存活時間
| 參數(shù) | 默認(rèn)值 | 描述 |
| maxConnectionAge | 0 | 連接存活的最長時間(秒),0 表示沒有限制。正在使用的連接不會不受此限制。 |
| ?maxIdleTime | 0 | ?空閑連接數(shù)最大存活時間,0 表示永不過期 |
| ?maxIdleTimeExcessConnections | 0 | ?當(dāng)連接數(shù)大于?minPoolSize 時,空閑連接數(shù)最大存活時間,0 表示永不過期 |
1.4、連接測試
| 參數(shù) | 默認(rèn)值 | 描述 |
| automaticTestTable | null | 測試的表名;如果設(shè)置了,c3p0 將使用該表名創(chuàng)建一個空表,并使用其來測試連接,preferredTestQuery 參數(shù)將被忽略。 |
| connectionTesterClassName | com.mchange.v2.c3p0.impl.DefaultConnectionTester | 連接測試的類名,需實(shí)現(xiàn)??com.mchange.v2.c3p0.ConnectionTester 或 com.mchange.v2.c3p0.QueryConnectionTester 接口。 |
| idleConnectionTestPeriod | 0 | 空閑連接測試的間隔(秒)。 |
| preferredTestQuery | null | 連接測試的語句;如果不設(shè)置,將使用?DatabaseMetaData 的?getTables 方法來測試,這可能時比較慢的。 |
| testConnectionOnCheckin | false | 連接返回連接池時,是否測試 |
| testConnectionOnCheckout | false | 從連接池獲取連接時,是否測試 |
1.5、預(yù)編譯池
| 參數(shù) | 默認(rèn)值 | 描述 |
| maxStatements | 0 | 緩存總體預(yù)編譯語句的最大數(shù)量 |
| maxStatementsPerConnection | 0 | 緩存每個連接中預(yù)編譯語句的最大數(shù)量 |
| statementCacheNumDeferredCloseThreads | 0 | 清理 statement 緩存的線程數(shù),如果需要設(shè)置,應(yīng)設(shè)置為 1。一些數(shù)據(jù)庫,特別是 oracle 會在連接使用時關(guān)閉 statement,數(shù)據(jù)庫無法很好的處理這種情況,進(jìn)而導(dǎo)致死鎖。清理的線程會在連接 |
maxStatements 和?maxStatementsPerConnection 如果都為 0,將不緩存預(yù)編譯語句。如果?maxStatements=0 and?maxStatementsPerConnection>0,maxStatementsPerConnection 起作用,不限制總的緩存數(shù)量;如果?maxStatements>0 and?maxStatementsPerConnection=0,maxStatements 起作用,不限單個連接的緩存數(shù)量。
1.6、數(shù)據(jù)庫中斷的恢復(fù)
| 參數(shù) | 默認(rèn)值 | 描述 |
| acquireRetryAttempts | 30 | 獲取連接失敗時的重試次數(shù) |
| acquireRetryDelay | 1000 | 連接獲取重試的時間間隔(毫秒) |
| ?breakAfterAcquireFailure | ?false | 嘗試獲取連接失敗時,是否聲明連接池斷開并永久關(guān)閉 |
1.7、自定義連接生命周期管理
| 參數(shù) | 默認(rèn)值 | 描述 |
| connectionCustomizerClassName | null | 連接生命周期管理的自定義類,需實(shí)現(xiàn)?com.mchange.v2.c3p0.ConnectionCustomizer 接口 |
1.8、處理未提交的事務(wù)
| 參數(shù) | 默認(rèn)值 | 描述 |
| autoCommitOnClose | false | 連接在返回連接池時是否自動提交事務(wù)。true,提交事務(wù);false,回滾事務(wù) |
| forceIgnoreUnresolvedTransactions | false | 連接在返回連接池時,是否強(qiáng)制不處理事務(wù);強(qiáng)烈不推薦設(shè)置為 true。 |
1.9、調(diào)試
| 參數(shù) | 默認(rèn)值 | 描述 |
| debugUnreturnedConnectionStackTraces | false | 是否記錄活動連接的堆棧信息;如果設(shè)為 true,且?unreturnedConnectionTimeout>0,當(dāng)連接借出時間 >?unreturnedConnectionTimeout 時,就會打印連接的堆棧信息,并刪除該連接。 |
| unreturnedConnectionTimeout | 0 | 連接未返回連接池的超時時間(秒) |
這兩個參數(shù)可用于幫助發(fā)現(xiàn)連接泄露。
1.10、避免熱部署內(nèi)存泄露
| 參數(shù) | 默認(rèn)值 | 描述 |
| contextClassLoaderSource | caller | 用于生成 c3p0 線程的類加載器來源,為 caller, library 或 none。caller 表示來源于連接池的調(diào)用者;library 表示來源于 c3p0 本身;none 表示使用系統(tǒng)類加載器 |
| privilegeSpawnedThreads | false | ?生成 c3p0 線程時是否使用 c3p0 庫中的 AccessControlContext;默認(rèn)(false)使用連接池調(diào)用者的 AccessControlContext。 |
在應(yīng)用熱部署、取消部署時,連接池可能會阻止垃圾回收進(jìn)而導(dǎo)致內(nèi)存泄露;?這兩個參數(shù)主要用于處理這種情況。
1.11、其它配置
| 參數(shù) | 默認(rèn)值 | 描述 |
| checkoutTimeout | 0 | 從連接獲取連接的超時時間,0 表示永不超時 |
| factoryClassLocation | null | c3p0 libraries的路徑,如果在本地(通常都是這樣),那么無需設(shè)置 |
| forceSynchronousCheckins | false | 連接返回連接池是否同步方式 |
| ?maxAdministrativeTaskTime | ?0 | ?管理任務(wù)運(yùn)行的最大時間(秒),超過改時間會終端任務(wù);0 表示管理任務(wù)永遠(yuǎn)不被打斷。 |
| ?numHelperThreads | ?3 | ?管理線程個數(shù) |
| usesTraditionalReflectiveProxies | false | 已過期。是否使用發(fā)射動態(tài)代理的方式來實(shí)現(xiàn) Connection 及 其他 JDBC 接口。 |
詳細(xì)說明可參考官網(wǎng)文檔:https://www.mchange.com/projects/c3p0/#configuration
2、原始連接操作
c3p0 提供 api 來訪問原始連接中的非標(biāo)準(zhǔn)接口:
- 把連接轉(zhuǎn)成
C3P0ProxyConnection - 然后調(diào)用
rawConnectionOperation方法
下面是獲取 PostgreSQL? JDBC 驅(qū)動中 CopyManager 對象的方法:
Connection connection = (C3P0ProxyConnection) c3p0DataSource.getConnection();
C3P0ProxyConnection castConnection = (C3P0ProxyConnection) connection;
Method method = BaseConnection.class.getMethod("getCopyAPI", new Class[]{});
CopyManager copyManager = (CopyManager) castConnection.rawConnectionOperation(method, C3P0ProxyConnection.RAW_CONNECTION, new Object[]{});
3、使用
3.1、直接使用
3.1.1、引入依賴
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
3.1.2、使用例子
package com.abc.demo.general.dbpool;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class C3p0Case {
public static void main(String[] args) throws PropertyVetoException {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
comboPooledDataSource.setJdbcUrl("jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("123456");
comboPooledDataSource.setInitialPoolSize(2);
comboPooledDataSource.setMinPoolSize(2);
comboPooledDataSource.setMaxPoolSize(10);
comboPooledDataSource.setPreferredTestQuery("select 1");
comboPooledDataSource.setIdleConnectionTestPeriod(60);
comboPooledDataSource.setTestConnectionOnCheckout(true);
comboPooledDataSource.setCheckoutTimeout(1000 * 30);
Connection connection = null;
Statement st = null;
ResultSet rs = null;
try {
connection = comboPooledDataSource.getConnection();
st = connection.createStatement();
rs = st.executeQuery("select version()");
if (rs.next()) {
System.out.println(rs.getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(connection);
}
//實(shí)際使用中一般是在應(yīng)用啟動時初始化數(shù)據(jù)源,應(yīng)用從數(shù)據(jù)源中獲取連接;并不會關(guān)閉數(shù)據(jù)源。
comboPooledDataSource.close();
}
private static void close(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3.2、在 SpringBoot 中使用
3.1.1、引入依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
3.1.2、單數(shù)據(jù)源
application.yml 配置:
spring:
datasource:
c3p0:
driver-class: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://10.40.9.11:3306/myDb?useUnicode=true&characterEncoding=UTF-8
user: root
password: 123456
initial-pool-size: 2
min-pool-size: 2
max-pool-size: 10
preferred-test-query: select 1
idle-connection-test-period: 60
test-connection-on-checkout: true
checkout-timeout: 30000
數(shù)據(jù)源配置類:
package com.abc.demo.config;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean("dataSource")
@ConfigurationProperties(prefix = "spring.datasource.c3p0")
public DataSource dataSource1() {
return DataSourceBuilder.create().type(ComboPooledDataSource.class).build();
}
}
使用:
@Autowired private DataSource dataSource;
3.1.3、多數(shù)據(jù)源
application.yml 配置:
spring:
datasource:
c3p0:
db1:
driver-class: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://10.40.9.11:3306/myDb?useUnicode=true&characterEncoding=UTF-8
user: root
password: InsYR0ot187!
initial-pool-size: 2
min-pool-size: 2
max-pool-size: 10
preferred-test-query: select 1
idle-connection-test-period: 60
test-connection-on-checkout: true
checkout-timeout: 30000
db2:
driver-class: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://10.40.9.12:3306/myDb?useUnicode=true&characterEncoding=UTF-8
user: root
password: InsYR0ot187!
initial-pool-size: 2
min-pool-size: 2
max-pool-size: 10
preferred-test-query: select 1
idle-connection-test-period: 60
test-connection-on-checkout: true
checkout-timeout: 30000
數(shù)據(jù)源配置類:
package com.abc.demo.config;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean("dataSource1")
@ConfigurationProperties(prefix = "spring.datasource.c3p0.db1")
public DataSource dataSource1() {
return DataSourceBuilder.create().type(ComboPooledDataSource.class).build();
}
@Bean("dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.c3p0.db2")
public DataSource dataSource2() {
return DataSourceBuilder.create().type(ComboPooledDataSource.class).build();
}
}
使用:
@Autowired
@Qualifier("dataSource1")
private DataSource dataSource1;
@Autowired
@Qualifier("dataSource2")
private DataSource dataSource2;
到此這篇關(guān)于 Java 數(shù)據(jù)庫連接池c3p0 介紹的文章就介紹到這了,更多相關(guān) Java 連接池c3p0 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot?實(shí)現(xiàn)不同context-path下的會話共享
這篇文章主要介紹了springboot?實(shí)現(xiàn)不同context-path下的會話共享,基于很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
關(guān)于IDEA報錯Error:java 不支持發(fā)行版本17的原因及解決方案
在rebuild或運(yùn)行項(xiàng)目時提示“Error:java: 錯誤: 不支持發(fā)行版本 17”,本文將給大家介紹了IDEA提示“Error:java: 錯誤: 不支持發(fā)行版本17”的原因及解決方案,需要的朋友可以參考下2023-09-09
Spring中的Schedule動態(tài)添加修改定時任務(wù)詳解
這篇文章主要介紹了Spring中的Schedule動態(tài)添加修改定時任務(wù)詳解,可能有人會問,為啥不用Quartz,Quartz自然是非常方便強(qiáng)大的,但不是本篇要講的內(nèi)容,本篇就偏要使用SpringSchedule來實(shí)現(xiàn)動態(tài)的cron表達(dá)式任務(wù),需要的朋友可以參考下2023-11-11
Java實(shí)現(xiàn)的斷點(diǎn)續(xù)傳功能的示例代碼
本篇文章主要介紹了Java實(shí)現(xiàn)的斷點(diǎn)續(xù)傳功能的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
SpringBoot解析指定Yaml配置文件的實(shí)現(xiàn)過程
這篇文章主要介紹了SpringBoot解析指定Yaml配置文件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
Java中Lambda表達(dá)式的進(jìn)化之路詳解
本文通過示例大家給大家介紹了Java中Lambda表達(dá)式的進(jìn)化之路,感興趣的的朋友一起看看吧,希望能夠給你帶來幫助2021-11-11

