一、概念
存放数据库链接的容器。
当系统初始化好之后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取链接对象,用户访问完之后,会将链接对象归还给容器。
简单来说,使用传统的JDBC方法,每次使用完,都会启动和关闭,这是十分影响系统的性能的。所以,建立一个数据库链接池,每次DOM\BOM操作之后只需要把链接对象归还容器即可。可以达到1. 节约资源 2. 用户访问高效的作用。
二、 C3P0(技术较老)
步骤:1. 导入JAR包
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.11</version>
</dependency>
步骤2 定义配置文件
-
名称必须是c3p0.properties 或者 c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </default-config></c3p0-config><!--配置连接池mysql--> <named-config name="mysql"> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/qwertyuiop?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true</property> <property name="user">root</property> <property name="password">root</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </named-config> <!--配置连接池2--> ...... -
位置:放在src目录下即可。
-
创建核心对象 数据库链接池对象ComboPooledDataSource
4.获取链接
package com.itheima.test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.jupiter.api.Test;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class dataResource {
@Test
// 测试,手动创建C3P0数据源
public void test1() throws SQLException {
// 获取dataSource,使用默认配置
DataSource ds = new ComboPooledDataSource();//此方法有多个重载,有参的可以调用c3p0-config.xml中的多个数据池
// 获取链接
for (int i = 1; i < 10; i++) {
Connection conn = ds.getConnection();
System.out.println("conn = " + conn);
}
}
}
三、Druid(阿里巴巴做的)
Druid技术由阿里团队提供,常用,重点。
使用步骤
-
导入jar包 druid
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.21</version> </dependency> -
定义配置文件:
• 配置文件是properties形式
• 可以叫任意名字,可以放在任意的目录下,但是不会主动加载
#druid.properties文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/zxcvbnm
username=root
password=root
#初始化链接的数量
initialSize=5
#最大链接数
maxActive=10
#最大超时时间
maxWait=3000
-
获取数据库连接池对象,通过工厂类来获取,DruidSourceFactory
-
创建核心对象 数据库链接池对象DruidDataSourceFactory
5.获取链接
public void test1() throws SQLException, IOException {
// 导入jar
// 2. 定义配置文件
// 3. 加载配置文件
Properties prop = new Properties();
InputStream is =dataResource.class.getResourceAsStream("druid.properties");
prop.load(is);
// 4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(prop);
// 5. 获取链接
Connection conn = ds.getConnection();
System.out.println("conn = " + conn);
}
上述的步骤还是有些麻烦,于是需要像sql初学时一样,定义工具类
-
类名称:JDBCUtils
-
提供静态代码快来加载配置文件,初始化连接池对象
-
提供的方法:
1.获取链接方法:通过数据库连接池获取链接
- 释放资源
3.获取连接池的方法
/*Druid连接池工具类*/
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
// 1. 定义成员变量DataSOURCE
private static DataSource dataSource;
static {
try {
//1. 定义成员变量
Properties prop = new Properties();
prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
// 2. 获取dataSource
dataSource= DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 获取链接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
// 释放资源
public static void close(Statement statement,Connection connection){
// if (statement!=null){
// try {
// statement.close();
// } catch (SQLException e) {
// throw new RuntimeException(e);
// }
// }
// if (connection!=null){
// try {
// connection.close();
// } catch (SQLException e) {
// throw new RuntimeException(e);
// }
// }
close(null,statement,connection);
}
public static void close(ResultSet rs,Statement statement, Connection connection){
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
// 获取连接池的方法
public static DataSource getDataSource(){
return dataSource;
}
}
四、DBCP、BoneCP
不常用