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