数据库连接池是一种管理数据库连接的技术,它可以在应用程序启动时创建一定数量的数据库连接,并将这些连接保存在一个连接池中。当应用程序需要访问数据库时,可以从连接池中获取一个空闲的连接,使用完毕后再归还给连接池。这样可以提高应用程序访问数据库的效率,减少数据库连接的开销。
Java中的数据库连接池主要有以下几个特点:
- 重用性:通过连接池复用已有的数据库连接,避免了频繁地打开和关闭数据库连接,提高了系统性能。
- 高效性:连接池可以预先创建和管理一定数量的数据库连接,减少了等待建立连接的时间。
- 安全性:连接池可以限制系统中同时存在的数据库连接数量,防止因为过多的连接导致系统资源耗尽。
- 管理性:连接池可以对数据库连接进行监控和管理,如空闲超时、异常处理等。
常见的连接池有C3P0、Druid、HikariCP 、DBCP
1、 JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方来实现。
2、 C3P0数据库连接池,速度相对较慢(只是慢一丢丢),但是稳定性很好,Hibernate,Spring底层用的就是C3P0。
3、 DBCP数据库连接池,速度比C3P0快,但是稳定性差。
4、 Proxool数据库连接池,有监控连接池状态的功能,但稳定性仍然比C3P0差一些。
5、 BoneCP数据库连接池,速度较快。
6、 Druid数据库连接池(德鲁伊连接池),由阿里提供,集DBCP,Proxool,C3P0连接池的优点于一身,是日常项目开发中使用频率最高的数据库连接池。
7、HikariCP:HikariCP是一个轻量级、高效的JDBC连接池,具有快速启动和低延迟的特点。HikariCP的设计目标是提供极佳的性能和可靠性,同时尽量减少资源消耗和开销。HikariCP支持各种JDBC驱动程序和数据源。相比于其他连接池,HikariCP配置简单,易于使用。
使用连接池的步骤如下:
使用数据库连接池的步骤如下:
- 引入相关jar包。需要导入的包包括JAVA通过jdbc访问mysql数据库所需的包,如mysql-connector-java-5.1.37-bin.jar;使用数据库连接池技术必需的包,如commons-pool.jar;以及使用dbcp连接池时所需的包,如commons-dbcp-1.2.2。配置数据源。这一步包括设置数据库URL、用户名和密码等相关信息。
- 从数据源中获取连接。在应用程序需要访问数据库时,可以通过调用数据源的getConnection()方法来获取数据库连接。
- 使用连接执行SQL操作。可以使用获取到的数据库连接来执行SQL查询或更新操作。
- 释放连接。完成SQL操作后,需要调用Connection对象的close()方法来释放数据库连接,将其返回到连接池中以供后续使用。
定义:
C3P0是一个开源的JDBC数据库连接池库,它提供了高度灵活和高性能的连接池实现。它可以与各种关系型数据库一起使用,包括MySQL、Oracle、SQL Server等。实际上,“C3P0"的名称代表"Connect3 Pool”,意味着它可以管理多个数据库连接。
1.1、导入jar包
jar包下载地址:https://sourceforge.net/projects/c3p0/
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
1.2、配置xml文件
1.3 c3p0-config.xml模板
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcworks1214?useServerPrepStmts=trueproperty>
<property name="user">rootproperty>
<property name="password">20040417property>
<property name="initialPoolSize">5property>
<property name="maxPoolSize">10property>
<property name="checkoutTimeout">3000property>
default-config>
c3p0-config>
测试代码:
注 文件会自动读取 C3P0的配置文件 c3p0-config.xml
package javajdbc连接池;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Dome {
public static void main(String[] args)throws PropertyVetoException, SQLException {
Dome d=new Dome();
d.test();
}
public void test() throws PropertyVetoException, SQLException {
//c3p0的数据源
ComboPooledDataSource dataSource=new ComboPooledDataSource();
//连接数据库参数
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1/数据库名");
dataSource.setUser("root"); //用户名
dataSource.setPassword("20040417"); //用户密码
//连接池参数设置
dataSource.setInitialPoolSize(5);
dataSource.setMaxPoolSize(20);//最大连接数
dataSource.setCheckoutTimeout(3000);//连接超时
Connection con=dataSource.getConnection();
System.out.println("c3p0连接成功");
//查询数据库
ResultSet rs=con.prepareStatement("select count(*) from grade").executeQuery();
while (rs.next()){
int count=rs.getInt(1);
System.out.println(count);
}
con.close();
}
}
定义:
Druid是阿里巴巴开源的一个功能强大且高性能的JDBC数据库连接池,它提供了丰富的功能和配置选项。Druid连接池是为监控而生,内置了强大的监控功能,这些监控特性并不会对性能产生影响。
2.1、导入jar包
Druid(德鲁伊) jar包下载地址(本人用1.2.0版本):https://repo1.maven.org/maven2/com/alibaba/druid/1.2.0/
2.2、添加配置文件 文件名自定义
src下的配置文件信息:
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver
initialSize=10
maxActive=20
maxWait=1000
filters=wall
测试代码:
package 德鲁伊连接池;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.Test;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Properties;
public class Druid {
@Test
// 创建一个Properties对象,用于加载src/jdbc.properties文件
public void show() throws Exception {
Properties properties = new Properties();
// 从文件中加载属性
properties.load(new FileInputStream("src/jdbc.properties"));
// 使用DruidDataSourceFactory创建一个数据源
DataSource ds= DruidDataSourceFactory.createDataSource(properties);
// 获取一个连接
Connection con=ds.getConnection();
// 执行一个查询,查询user表中的记录数
ResultSet rs=con.prepareStatement(" select count(*)from user ").executeQuery();
// 遍历查询结果
while (rs.next()){
int str=rs.getInt(1);
System.out.println(str+"人");
}
// 关闭连接
con.close();
}
}
//输出结果 为 5人
HikariCP连接池定义:
HikariCP是由日本程序员开源的一个数据库连接池组件, Hikari连接池号称“史上最快连接池,代码非常轻量,并且速度非常的快。根据官方提供的数据,在i7,开启32个线程32个连接的情况下,进行随机数据库读写操作,HikariCP的速度是现在常用的C3P0数据库连接池的数百倍。在SpringBoot2.0中,官方也是推荐使用HikariCP
3.1、导入jar包:
HikariCP包 jar包下载地址:https://mvnrepository.com/artifact/com.zaxxer/HikariCP/4.0.3
# 数据库连接URL
jdbcUrl=jdbc:mysql://localhost:3306/mydatabase
# 数据库用户名
username=myusername
# 数据库密码
password=mypassword
# 连接池名称
poolName=MyConnectionPool
# 连接池大小
maximumPoolSize=10
# 最小空闲连接数
minimumIdle=5
# 连接超时时间(毫秒)
connectionTimeout=30000
# 空闲连接超时时间(毫秒)
idleTimeout=600000
# 最大生存时间(毫秒)
maxLifetime=1800000
测试代码:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class HikariCPDemo {
private static final String DB_URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "123456";
public static void main(String[] args) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(DB_URL);
config.setUsername(DB_USER);
config.setPassword(DB_PASSWORD);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource dataSource = new HikariDataSource(config);
try (Connection connection = dataSource.getConnection()) {
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
dataSource.close();
}
}
}
//输出结果为 ID:1,Name:张三
DBCP链接池定义:
全称Database Connection Pool,是Apache下的一个Java连接池项目,也是DBCP,全称Database Connection Pool,是Apache下的一个Java连接池项目,也是Tomcat使用的连接池组件。数据库连接是一个耗时且耗资源的行为,通过使用DBCP连接池,可以预先建立与数据库的连接,从而减少打开和关闭连接的时间和资源消耗。
4.1、引入jar包:
官网俩个jar包下载网址:
Pool – Download Apache Commons Pool
DBCP – Download Apache Commons DBCP
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/eea52c223f9e42ca9b4c2489c6f25c9f.jpeg#pic_center)4.2、DBCP配置文件代码如下:
url=jdbc:mysql://localhost:3306/database
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=root
initialSize=10
maxActive=30
maxWait=3000
测试代码演示:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.dbcp2.BasicDataSource;
public class DBCPDemo {
private static final String DB_URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "123456";
public static void main(String[] args) {
// 创建数据源对象
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl(DB_URL);
dataSource.setUsername(DB_USER);
dataSource.setPassword(DB_PASSWORD);
// 设置连接池参数
dataSource.setInitialSize(5); // 初始连接数
dataSource.setMaxTotal(10); // 最大连接数
dataSource.setMinIdle(2); // 最小空闲连接数
dataSource.setMaxIdle(5); // 最大空闲连接数
dataSource.setMaxWaitMillis(10000); // 获取连接等待时间
try (Connection connection = dataSource.getConnection()) {
// 创建语句对象
Statement statement = connection.createStatement();
// 执行查询操作
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
// 处理查询结果
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据源
dataSource.close();
}
}
}
//输出结果为 ID:1,Name:张三