JDBC03——数据库连接池


基本介绍

问题引出

  • 连接5000次数据库

1.不即时关闭连接——抛出异常

package com.recorder.conn;

import com.recorder.jdbcutils.JdbcUtils;
import org.junit.jupiter.api.Test;

/**
 * @author 紫英
 * @version 1.0
 * @discription 数据库连接5000问题
 */
public class ConQuestion {

    @Test
    public void con(){
        for (int i = 0; i < 5000; i++) {

            JdbcUtils.getConnection();
            //做一些工作,比如得到 PreparedStatement ,发送 sql
            // ..........

        }
    }
}

2.及时关闭连接——耗费时间过久

package com.recorder.conn;

import com.recorder.jdbcutils.JdbcUtils;
import org.junit.jupiter.api.Test;

import java.sql.Connection;

/**
 * @author 紫英
 * @version 1.0
 * @discription 数据库连接5000问题
 */
public class ConQuestion {

    @Test
    public void con() {
        long start = System.currentTimeMillis();
        System.out.println("开始连接.....");

        for (int i = 0; i < 5000; i++) {

            Connection connection = JdbcUtils.getConnection();
            //做一些工作,比如得到 PreparedStatement ,发送 sql
            // ..........
            JdbcUtils.close(null,null,connection);

        }
        long end = System.currentTimeMillis();
        System.out.println("传统方式5000 次 耗时=" + (end - start));//传统方式 5000次
    }

}

问题分析

 3.就像火车站安检,如果人数过多需要分批进入,一次性涌入会造成混乱。

基本介绍

 

 放回连接池指Java程序不在对连接池中的链接进行引用,该连接依旧存在。

连接池种类

C3P0

第一种方式(不推荐)

 public void testC3P0_01() throws Exception {
        //1. 创建一个数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        //2. 通过配置文件 jdbc.properties 获取相关连接的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\jdbc.properties"));
        //读取相关的属性值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        //给数据源 comboPooledDataSource 设置相关的参数
        // 注意:连接管理是由 comboPooledDataSource 来管理
        comboPooledDataSource.setDriverClass(driver);
        comboPooledDataSource.setJdbcUrl(url);
        comboPooledDataSource.setUser(user);
        comboPooledDataSource.setPassword(password);
        //设置初始化连接数
        comboPooledDataSource.setInitialPoolSize(10);
        //最大连接数
        comboPooledDataSource.setMaxPoolSize(50);
        //测试连接池的效率, 测试对 mysql 5000 次操作
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            Connection connection = comboPooledDataSource.getConnection();
            //这个方法就是从 DataSource 接口 实现的
            //System.out.println("连接 OK");
            connection.close();
        }
        long end = System.currentTimeMillis();
        //c3p0 5000 连接 mysql 耗时=391
        System.out.println("c3p0 5000 连接 mysql 耗时=" + (end - start));

    }

第二种方式(推荐——通过XML配置文件)

 

//第二种方式 使用配置文件模板来完成
    // 1. 将 c3p0 提供的 c3p0.config.xml 拷贝到 src 目录下
    // 2. 该文件指定了连接数据库和连接池的相关参数
    @Test
    public void testC3P0_02() throws SQLException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("recorder");
        //测试 5000 次连接
         long start = System.currentTimeMillis();
        System.out.println("开始执行....");
        for (int i = 0; i < 5000; i++) {
            Connection connection = comboPooledDataSource.getConnection();
        //System.out.println("连接 OK~");
            connection.close();
        }
        long end = System.currentTimeMillis();
        //c3p0 的第二种方式 耗时=413
        System.out.println("c3p0 的第二种方式(500000) 耗时=" + (end - start));

    }

Druid(德鲁伊)

代码演示

可以看出效率还是很高的

package com.recorder.conn;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.jupiter.api.Test;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

/**
 * @author 紫英
 * @version 1.0
 * @discription 德鲁伊连接池
 */
public class Druid {

    @Test
    public void testDruid() throws Exception {

        //1. 加入 Druid jar 包
        // 2. 加入 配置文件 druid.properties , 将该文件拷贝项目的 src 目录
        // 3. 创建 Properties 对象, 读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\druid.properties"));
        //4. 创建一个指定参数的数据库连接池, Druid 连接池
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 500000; i++) {
            Connection connection = dataSource.getConnection();
            //System.out.println(connection.getClass());
            //System.out.println("连接成功!");
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("druid 连接池 操作 500000 耗时=" + (end - start));


    }

}
德鲁伊

c3p0



将 JdbcUtils 工具类改成 Druid(德鲁伊)实现