JDBC连接池

JDBC连接池原理

首先看如下图:

5b06a2a3346e492caa02e78fe70c65a5.png

 

图片可能有点丑!!!

(注:上面方块是在连接池里的连接资源,下面火柴人是用户) 

1、池子中,我们有4个连接的资源
2、我们有5个用户
3、当我们用户需要的时候呢,就把连接给用户,此时图就成这样了

aea702cf712f4d6cad1f42b2a8e5a343.png

 

1、如上图所示,一个用户则用一个连接

2、多出来用户来并没有连接可以用

  • 那么我们有什么好的处理方式呢???

        (1)、等其他用户用完,我再用

        (2)、或者重新创建一个连接给连接池,连接池再分配给我们的用户(如图) 

 7310f2d627fd4d17a0f4cd34d4f89635.png

#当用户用完之后,会把连接还给连接池,并不关闭

实例 (C3P0连接池)

准备工作 : 

        1.去谷歌搜索JDBC C3P0,下载C3P0连接池的jar包,解压后,在lib目录下可以找到两个jar包

        2.同之前导入mysql的jar包类似,将C3P0的这两个jar包拷贝到IDEA中存放jar包的目录下,右键jar包,选择“Add as Library...”将jar加入到项目。 加入成功后可以看到jar包下的子目录

传统方法

C3P0_Demo1类

package connection_pool.c3p0;
 
import com.mchange.v2.c3p0.ComboPooledDataSource;
 
import java.beans.PropertyVetoException;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
 
/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class C3P0_Demo1 {
    public static void main(String[] args) throws IOException, PropertyVetoException, SQLException {
        //创建数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        //从properties配置文件中获取相关信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/api/connection/mysql.properties"));
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
 
        //通过ComboPooledDataSource类的setXxx方法来设置信息
        comboPooledDataSource.setDriverClass(driver);
        comboPooledDataSource.setJdbcUrl(url);
        comboPooledDataSource.setUser(user);
        comboPooledDataSource.setPassword(password);
        //设置连接池初始连接数
        comboPooledDataSource.setInitialPoolSize(10);
        //设置连接池最大连接数
        comboPooledDataSource.setMaxPoolSize(50);
        /**
         * 初始连接数指连接池被创建后初始化连接的数量;
         * 最大连接数指连接池内的连接最多50个;
         * 当50个连接全部被使用时,新的连接请求就会进入等待队列。
         */
 
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; ++i) {
            //获取连接
            Connection connection = comboPooledDataSource.getConnection();
 
            //释放资源(仅仅是取消了对连接池内连接的引用,连接本身不受影响。
            connection.close();
        }
        long end = System.currentTimeMillis();
 
        System.out.println("使用C3P0连接池后,连接MySQL5000次需要" + (end - start) + "ms");
    }
}

通过配置文件 

c3p0-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!-- 数据源名称,代表连接池 -->
    <named-config name="Cyan">
        <!-- 配置数据库用户名 -->
        <property name="user">root</property>
        <!-- 配置数据库密码 -->
        <property name="password">123456</property>
        <!-- 配置数据库URL -->
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_ex</property>
        <!-- 配置数据库驱动 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <!-- 数据库连接池一次性向数据库要多少个连接对象 -->
        <property name="acquireIncrement">20</property>
        <!-- 初始化连接数 -->
        <property name="initialPoolSize">10</property>
        <!-- 最小连接数 -->
        <property name="minPoolSize">5</property>
        <!-- 最大连接数。Default: 15 -->
        <property name="maxPoolSize">50</property>
        <!-- 可连接的最多命令对象数 -->
        <property name="maxStatements">5</property>
        <!-- 每个连接对象可连接的最多命令对象数 -->
        <property name="maxStatementsPerConnection">2</property>
        <!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能 通过多线程实现多个操作同时被执行。Default:3 -->
        <property name="numHelperThreads">3</property>
        <!--用户修改系统配置参数执行前最多等待300秒。Default: 300 -->
        <property name="propertyCycle">3</property>
        <!-- 获取连接超时设置 默认是一直等待单位毫秒 -->
        <property name="checkoutTimeout">1000</property>
        <!--每多少秒检查所有连接池中的空闲连接。Default: 0 -->
        <property name="idleConnectionTestPeriod">3</property>
        <!--最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime">10</property>
        <!--配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待它close再断开。配置为0的时候则不会对连接的生存时间进行限制。 -->
        <property name="maxIdleTimeExcessConnections">5</property>
        <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
        <property name="acquireRetryDelay">1000</property>
        <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。Default: null -->
        <property name="automaticTestTable">Test</property>
        <!-- 获取connection时测试是否有效 -->
        <property name="testConnectionOnCheckin">true</property>
    </named-config>
</c3p0-config>

C3P0_Demo2类

package connection_pool.c3p0;
 
import com.mchange.v2.c3p0.ComboPooledDataSource;
 
import java.sql.Connection;
import java.sql.SQLException;
 
public class C3P0_Demo2 {
    public static void main(String[] args) throws SQLException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("Cyan");
 
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            Connection connection = comboPooledDataSource.getConnection();
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("通过配置文件设置参数后,C3P0连接池连接5000次MySQL耗时" + (end - start) + "ms");
    }
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TC_FANCY

你的支持是我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值