目录
前言:为什么使用数据库连接池?
答:连接,最后关闭。每次是需要向计算机底层申请资源的。经常开关,会造成,资源请求费时间,所以用数据库连接池。下面介绍两种数据库连接池技术C3P0 和 Druid.
1.C3P0
C3P0是一个Java数据库连接池的名字,它的名称来源有两个方面的含义。
首先,C3P0的名字来源于“Crosby as in cross-eyed C3PO”,这是《星球大战》电影中的一个角色,是一位机器人信息专家。这个角色的名字在Java社区中广为人知,因此被用来命名这个数据库连接池。
其次,C3P0的名字也代表了连接池的一些特性。其中,C代表连接(Connection),3代表三方(Party),P代表协议(Protocol),0代表版本号。这些特性的含义是,C3P0是一个基于协议的连接池,可以支持多方连接,并且具有多个版本的协议。
( 左:R2-RD 右:C-3P0)
总之,C3P0名字的来源融合了《星球大战》角色名字的知名度和连接池的一些特性,以此来命名这个Java数据库连接池。
C3p0是一个成熟的、高并发的 JDBC 连接池库,支持缓存和 PreparedStatements 的重用。
C3P0 数据库连接池技术:
1.导入jar包
2.定义配置文件
名称:c3p0.properties 或c3p0-config.xml
路径:src目录下
3.创建核心对象 数据库连接池对象 ComboPooleDataSource
4.获取连接 getConnection
1.1 C3P0Demo2
"package com.datasource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3PDemo2 {
public static void main(String[] args) throws SQLException {
//1.导入jar包
//2.配置文件
//3.获取数据源对象
DataSource ds =new ComboPooledDataSource();
//4.获取连接
for (int i=0;i<=11;i++){
Connection conn = ds.getConnection();
System.out.println(i+":"+conn);
if(i == 5){
conn.close();
}
}
//5.操作数据库
//6.释放资源
}
}
1.2 c3p0-config.xml
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db2?useSSL=false&characterEncoding=UTF-8</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<!-- 初始化申请的连接数量 -->
<property name="initialPoolSize">5</property>
<!-- 最大的连接数量 -->
<property name="maxPoolSize">10</property>
<!-- 超时时间 -->
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db2?useSSL=false</property>
<property name="user">root</property>
<property name="password">Aa123456.</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
2.Druid
Druid[ˈdruːɪd] 数据库连接池的名称来源于古代文明中的德鲁伊教士。德鲁伊教士是古凯尔特人的祭司,他们负责保护森林和自然生态,并且具有将人与自然力量联系起来的神秘能力。Druid一词直接源于古凯尔特语“druid”,意为“熟悉信仰的人”。因此,Druid数据库连接池的名称寓意为一种能够熟悉并理解数据库连接和管理的人所使用的工具。同时,Druid也是一种高性能的数据库连接池,能够为Java应用程序提供可靠、可扩展的数据库连接管理服务
druid 数据库连接池技术:
1.导入jar包
2.定义配置文件
名称:xxx.properties
3.加载配置文件 Properties
4.获取数据库连接池对象,通过工厂来获取:DruidDataSourceFactory
5.获取数据连接:getConnection
2.1 DruidDemo
package com.druid01;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
public class DruidDemo {
public static void main(String[] args) throws Exception {
// 1.导入jar包
// 2.定义配置文件
// 3. 加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
// 4.获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
// 5.获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
2.2 JDBCUtils 工具类 druid
package com.druid01;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtils {
private static DataSource ds;
static {
try {
// 1. 加载配置文件
Properties pro = new Properties();
try (InputStream input = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")) {
if (input == null) {
throw new RuntimeException("druid.properties 文件未找到!");
}
pro.load(input);
}
// 2. 初始化 Druid 数据源
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
throw new RuntimeException("初始化 Druid 数据源失败", e);
}
}
/**
* 获取数据库连接
*
* @return Connection 对象
* @throws SQLException 如果连接失败
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 关闭资源
*
* @param resources 需要关闭的资源(Connection、Statement、ResultSet 等)
*/
public static void close(AutoCloseable... resources) {
for (AutoCloseable resource : resources) {
if (resource != null) {
try {
resource.close();
} catch (Exception e) {
throw new RuntimeException("关闭资源失败", e);
}
}
}
}
/**
* 获取数据源
*
* @return DataSource 对象
*/
public static DataSource getDataSource() {
return ds;
}
}
2.3 DruidJDBCUtilsTest
package com.druid01;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DruidJDBCUtilsTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1. 获取连接
conn = JDBCUtils.getConnection();
// 2. 执行 SQL
String sql = "SELECT * FROM dept WHERE id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 1);
rs = pstmt.executeQuery();
// 3. 处理结果集
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 关闭资源
JDBCUtils.close(rs, pstmt, conn);
}
}
}
2.4 druid.properties
# 数据库连接配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2?useSSL=false&characterEncoding=UTF-8
username=root
password=root
# 初始化链接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
# 连接池配置
# 初始化时创建的连接数
# initialSize=5
# 最小空闲连接数
# minIdle=3
# 最大活跃连接数
# maxActive=20
# 获取连接的最大等待时间(单位:毫秒)
# maxWait=60000
# 检查空闲连接的间隔时间(单位:毫秒)
# timeBetweenEvictionRunsMillis=60000
# 连接在池中最小生存时间(单位:毫秒)
# minEvictableIdleTimeMillis=300000
# 用于检测连接是否有效的 SQL 查询语句
# validationQuery=SELECT 1
# 是否在空闲时检测连接的有效性
# testWhileIdle=true
# 是否在获取连接时检测连接的有效性
# testOnBorrow=false
# 是否在归还连接时检测连接的有效性
# testOnReturn=false
# 是否缓存 PreparedStatement(提高性能)
# poolPreparedStatements=true
# 每个连接最多缓存的 PreparedStatement 数量
# maxPoolPreparedStatementPerConnectionSize=20
END :-)