目录
- 1、配置参数
- 2、使用
- 2.1、直接使用
- 2.1.1、引入依赖
- 2.1.2、使用例子
- 2.2、在 SpringBoot 中使用
- 2.2.1、引入依赖
- 2.2.2、单数据源
- 2.2.3、多数据源
DBCP(Database connection pooling) 是 Apache 旗下 Commons 项目下的一个子项目,提供连接池功能;本文主要介绍 DBCP 的基本使用,文中使用到的软件版本:Java 1.8.0_191、DBCP 2.9.0、Spring Boot 2.3.12.RELEASE。
1、配置参数
连接属性,格式为: [propertyName=property;]*
"user" and "password" 将被除外,所以在此不需要包含这两个属性。
默认的事务隔离级别
NONE、READ_COMMITTED、READ_UNCOMMITTED、
REPEATABLE_READ、SERIALIZABLE
默认的 catalog。(目录,类似于模式名,但比模式名更加抽象;
Oracle,MySQL 不支持,MS SQL Server = 数据库名)
如果设置为 true,则连接归还到连接池时,
如果 auto commit=true 且 read-only=false,则会自动执行一次 rollback()。
连接池返回连接给调用者前用来校验的查询sql。
如果指定,则这个查询 SQL 必须至少返回一行数据;如果没有指定,则通过调用 isValid() 方法进行校验。
如果允许,可以使用下面的代码来访问底层连接:
Connection conn = ds.getConnection(); Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate(); ... conn.close()
removeAbandonedOnBorrow
是否删除泄露的连接;如果超过一个活动连接未使用的时间超过 removeAbandonedTimeout,则是一个泄露的连接。
创建 Statement,PreparedStatement,CallableStatement 或使用这些对象执行一个查询都会重置连接的上传使用时间。
removeAbandonedOnMaintenance:空闲连接校验时是否回收泄露的连接,要使启用该设置需把 timeBetweenEvictionRunsMillis 设置为整数
removeAbandonedOnBorrow:从连接池获取连接时是否回收泄露的连接,要使启用该设置还需满足 'getNumActive() > getMaxTotal() - 3 and getNumIdle() < 2'
是否快速失败验证;如果设置为 true,当发生致命异常时,不再执行 isValid(),也不去执行验证查询语句。致命的异常码有:
57P01 (ADMIN SHUTDOWN)
57P02 (CRASH SHUTDOWN)
57P03 (CANNOT CONNECT NOW)
01002 (SQL92 disconnect error)
JZ0C0 (Sybase disconnect error)
JZ0C1 (Sybase disconnect error)
Any SQL_STATE code that starts with "08"
要覆盖默认的异常代码,可以设置 disconnectionSqlCodes 属性。
详细的配置说明可参考官网文档:http://commons.apache.org/proper/commons-dbcp/configuration.html。
2、使用
2.1、直接使用
2.1.1、引入依赖
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.9.0</version> </dependency>
2.1.2、使用例子
package com.abc.demo.general.dbpool;
import org.apache.commons.dbcp2.BasicDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBCPCase {
public static void main(String[] args) {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setUrl("jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8");
basicDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
basicDataSource.setUsername("root");
basicDataSource.setPassword("123456");
basicDataSource.setMaxTotal(20);
basicDataSource.setMinIdle(5);
Connection connection = null;
Statement st = null;
ResultSet rs = null;
try {
connection = basicDataSource.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);
}
try {
//实际使用中一般是在应用启动时初始化数据源,应用从数据源中获取连接;并不会关闭数据源。
basicDataSource.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void close(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.2、在 SpringBoot 中使用
2.2.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>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
2.2.2、单数据源
application.yml 配置:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.40.9.11:3306/myDb?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
type: org.apache.commons.dbcp2.BasicDataSource
dbcp2:
max-total: 20
max-idle: 5
使用:
@Autowired private DataSource dataSource;
2.2.3、多数据源
application.yml 配置:
spring:
datasource:
dbcp2:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.40.9.11:3306/myDb?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
max-total: 20
max-idle: 5
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.40.9.12:3306/myDb?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
max-total: 20
max-idle: 5
数据源配置类:
package com.abc.demo.config;
import org.apache.commons.dbcp2.BasicDataSource;
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.dbcp2.db1")
public DataSource dataSource1() {
return DataSourceBuilder.create().type(BasicDataSource.class).build();
}
@Bean("dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.dbcp2.db2")
public DataSource dataSource2() {
return DataSourceBuilder.create().type(BasicDataSource.class).build();
}
}
使用:
@Autowired
@Qualifier("dataSource1")
private DataSource dataSource1;
@Autowired
@Qualifier("dataSource2")
private DataSource dataSource2;
到此这篇关于 Java 数据库连接池 DBCP 的介绍的文章就介绍到这了,更多相关 Java 连接池 DBCP内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!
