1、数据库连接池基本介绍
1.预先再缓冲池中放入一定数量的连接,当需要建立连接时,只需要从“缓冲池”中取出一个,使用完毕后放回。
2.数据库连接池负责分配、管理和释放数据库连接,它允许多个程序重复的使用现有的数据库连接,而不是重新建立一个。
3.当应用程序向连接池请求的数量超过最大连接数量时,这些请求将被加入到等待队列。
2、连接池的种类
1.C3P0数据库连接池,速度相对较慢,稳定性不错(hubernate,spring)。
2.DBCP数据库连接池,速度相对C3P0较快,但不是很稳定。
3.Druid(德鲁伊)是阿里提供的数据库的连接池,集DBCP,C3P0,Proxool有点于一身的数据库连接池。
等等…
3、C3P0数据库连接池实现
1.首相要将jar包引入到项目中
2.设置配置文件如下:在src目录下创建文件名 c3p0-config.xml 文件
代码如下:
<c3p0-config>
<!--使用默认的配置读取数据库连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/MovieDB</property>
<property name="user">root</property>
<property name="password">SASA</property>
<!-- 连接池参数 -->
<!--初始化申请的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大的连接数量-->
<property name="maxPoolSize">10</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
</c3p0-config>
3.测试:
方法一:
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
public class Demo1 {
public static void main(String[] args) throws Exception {
method01();
}
// 方法一:手动设置连接参数
public static void method01() throws PropertyVetoException, PropertyVetoException, SQLException {
ComboPooledDataSource cpds = new ComboPooledDataSource();
// 为连接池设置驱动
cpds.setDriverClass("com.mysql.cj.jdbc.Driver");
// 设置连接池连接数据库的参数
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/MovieDB");
cpds.setUser("root");
cpds.setPassword("SASA");
// 设置初始化的连接数量
cpds.setInitialPoolSize(5);
// 设置最大连接数量
cpds.setMaxPoolSize(10);
// 测试连接速度
long start = System.currentTimeMillis();
for (int i = 0; i < 50000; i++) {
Connection connection = cpds.getConnection();
connection.close();
}
long end = System.currentTimeMillis();
System.out.println("C3P0 所用时间:" + (end-start));
}
}
方法二:
配置文件:
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/MovieDB?serverTimezone=Asia/Shanghai</property>
<property name="user">root</property>
<property name="password">SASA</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
测试:
// 方法二:使用配置文件创建连接池
public static void method02() throws Exception{
// 这里填写的参数,必须要和配置文件中 <name-config name ="zcc_mysql"></name-config> 一致
ComboPooledDataSource cpds = new ComboPooledDataSource("otherc3p0");
long start = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
Connection connection = cpds.getConnection();
connection.close();
}
long end = System.currentTimeMillis();
System.out.println("C3P0 所用时间:" + (end-start)); // 1580
}
运行结果:
4、总结
C3P0是一个Java数据库连接池,可以实现对数据库连接的管理和复用,提高数据库操作的性能和效率。以下是对C3P0连接池的总结:
1、配置和初始化:通过配置文件或者代码,可以设置连接池的参数,包括最大连接数、最小连接数、连接超时时间、空闲连接检测等。连接池初始化时,会创建一定数量的连接,并放入连接池中。
2、连接获取和释放:应用程序通过C3P0连接池的API从连接池中获取连接,使用完毕后,需要将连接释放回连接池。连接池会自动管理连接的获取和释放,保证连接的有效性和安全性。
3、连接的复用:C3P0连接池会尽量复用已有的连接,减少连接的创建和销毁的开销。当应用程序需要连接时,连接池会先从空闲连接中取出可用的连接,如果没有可用连接,则根据配置创建新的连接。使用完毕后,连接会返回到连接池中,等待下次使用。
4、连接的管理:C3P0连接池会跟踪连接的状态和使用情况,可以根据配置进行连接的动态管理。连接池可以限制最大连接数,当连接数达到最大值时,新的连接请求会被阻塞或者抛出异常。连接池也可以根据空闲时间来关闭长时间未使用的连接,避免资源的浪费。
5、异常处理和重试:C3P0连接池可以处理连接的异常和错误,包括连接的超时、数据库的宕机等。连接池会自动重试连接,尝试重新建立连接,保证连接的可用性。连接池还可以定义连接的验证查询语句,用于检测连接的有效性。