文章目录

  • 数据库连接池介绍
  • c3p0、DBCP、Druid的使用
  • c3p0
  • dbcp
  • druid
  • 三大连接池的区别
  • 自己实现一个数据库连接池


数据库连接池介绍

对于简单的数据库连接,在使用之前创建一个连接,在使用之后释放连接,当系统比较复杂时,频繁的进行资源的连接和释放时很消耗系统性能的;

数据库连接池:负责分配、管理和释放数据库的连接,它允许服务重复使用一个数据库既有的数据库连接,不需要重复连接;

连接池的优势:

  • 资源复用;
  • 更快的系统相应速度;
  • 新的一种资源分配方式;
  • 统一的连接管理,避免数据库连接泄露;

常用的数据库连接池:

  • c3p0:简单易用,稳定好,但是并发高的时候响应比较慢;
  • DBCP:Apache旗下的一个开源的数据库操作的工具类,依附于Commons中的子项目;
  • Druid:阿里开源的一个数据库连接池,除了实现数据库连接池本身的功能,并且提供了强大的监控功能;

c3p0、DBCP、Druid的使用

pom.xml需要添加的配置

<dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>

    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.5.4</version>
    </dependency>
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.3</version>
      <scope>compile</scope>
    </dependency>


    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.0.26</version>
      <scope>compile</scope>
    </dependency>

c3p0

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!--配置连接池mysql-->
    <named-config name="mysql">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test4</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <!-- 初始化连接数 -->
        <property name="initialPoolSize">10</property>
        <!--最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime">30</property>
        <!--连接池中保留的最大连接数。Default: 15 -->
        <property name="maxPoolSize">100</property>
        <!-- 最小连接数 -->
        <property name="minPoolSize">10</property>
    </named-config>

    <!--配置连接池mysql-->
    <named-config name="online">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test4</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <!-- 初始化连接数 -->
        <property name="initialPoolSize">10</property>
        <!--最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime">30</property>
        <!--连接池中保留的最大连接数。Default: 15 -->
        <property name="maxPoolSize">100</property>
        <!-- 最小连接数 -->
        <property name="minPoolSize">10</property>
    </named-config>

    <!--线下数据库配置-->
    <named-config name="offline">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test4</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <!-- 初始化连接数 -->
        <property name="initialPoolSize">10</property>
        <!--最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime">30</property>
        <!--连接池中保留的最大连接数。Default: 15 -->
        <property name="maxPoolSize">100</property>
        <!-- 最小连接数 -->
        <property name="minPoolSize">10</property>
    </named-config>

</c3p0-config>
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @ClassName TestDemo5
 * @Description c3p0
 * @Author lzq
 * @Date 2019/7/6 20:18
 * @Version 1.0
 **/
public class TestDemo5 {
    public static void main(String[] args) {
        ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
        try {
            Connection connection = dataSource.getConnection();
            Statement statement = connection.createStatement();
            String sql = "select * from student";
            ResultSet resultSet = statement.executeQuery(sql);

            while (resultSet.next()) {
                int sid = resultSet.getInt("sid");
                String sname = resultSet.getString("sname");
                int sage = resultSet.getInt("sage");
                String ssex = resultSet.getString("ssex");
                System.out.println(sid+"\t"+sname+"\t"+sage+"\t"+ssex);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            dataSource.close();
        }
    }
}

poco 连接池 mysql 连接池 数据库_数据库连接池

dbcp

dpcp.properties

#驱动路径
driver=com.mysql.jdbc.Driver
#JDBC连接URL
url=jdbc:mysql://127.0.0.1:3306/test4
#账号
username=root
#密码
password=123456
#初始连接池大小
initPoolSize=10
#最大空闲时间
maxIdleTime=20
#最大连接池数
maxPoolSize=40
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @ClassName TestDemo6
 * @Description dbcp
 * @Author lzq
 * @Date 2019/7/6 20:27
 * @Version 1.0
 **/
public class TestDemo6 {
    public static void main(String[] args) {
        BasicDataSource dataSource = new BasicDataSource();
        Properties pro = new Properties();
        try {
            pro.load(TestDemo6.class.getClassLoader
                    ().getResourceAsStream("dbcp.properties"));
            dataSource.setDriverClassName(pro.getProperty("driver"));
            dataSource.setUrl(pro.getProperty("url"));
            dataSource.setUsername(pro.getProperty("username"));
            dataSource.setPassword(pro.getProperty("password"));
            //初始化连接数量
            dataSource.setInitialSize(Integer.parseInt(pro.getProperty("initPoolSize")));
            //配置连接等待超时时间
            dataSource.setMaxWait(Long.parseLong(pro.getProperty("maxIdleTime")));
            //最大并发连接数
            dataSource.setMaxActive(Integer.parseInt(pro.getProperty("maxPoolSize")));
            Connection connection = dataSource.getConnection();
            Statement statement = connection.createStatement();
            String sql = "select * from student";
            ResultSet resultSet = statement.executeQuery(sql);

            while (resultSet.next()) {
                int sid = resultSet.getInt("sid");
                String sname = resultSet.getString("sname");
                int sage = resultSet.getInt("sage");
                String ssex = resultSet.getString("ssex");
                System.out.println(sid+"\t"+sname+"\t"+sage+"\t"+ssex);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                dataSource.close();
                dataSource.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

poco 连接池 mysql 连接池 数据库_三大连接池的区别_02

druid

druid.properties

#驱动路径
driver=com.mysql.jdbc.Driver
#JDBC连接URL
url=jdbc:mysql://127.0.0.1:3306/test4
#账号
username=root
#密码
password=123456
#初始连接池大小
initPoolSize=10
#最大空闲时间
maxIdleTime=20
#最大连接池数
maxPoolSize=40
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @ClassName TestDemo7
 * @Description druid
 * @Author lzq
 * @Date 2019/7/6 20:27
 * @Version 1.0
 **/
public class TestDemo7 {
    public static void main(String[] args) throws IOException, SQLException {
        DruidDataSource dataSource = new DruidDataSource();
        //读取配置信息
        Properties pro = new Properties();
        pro.load(TestDemo7.class.getClassLoader
                ().getResourceAsStream("druid.properties"));
        dataSource.setDriverClassName(pro.getProperty("driver"));
        dataSource.setUrl(pro.getProperty("url"));
        dataSource.setUsername(pro.getProperty("username"));
        dataSource.setPassword(pro.getProperty("password"));
        //初始化连接数量
        dataSource.setInitialSize(Integer.parseInt(pro.getProperty("initPoolSize")));
        //配置连接等待超时时间
        dataSource.setMaxWait(Long.parseLong(pro.getProperty("maxIdleTime")));
        //最大并发连接数
        dataSource.setMaxActive(Integer.parseInt(pro.getProperty("maxPoolSize")));

        Connection connection = dataSource.getConnection();
        Statement statement = connection.createStatement();
        String sql = "select * from student";
        ResultSet resultSet = statement.executeQuery(sql);

        while (resultSet.next()) {
            int sid = resultSet.getInt("sid");
            String sname = resultSet.getString("sname");
            int sage = resultSet.getInt("sage");
            String ssex = resultSet.getString("ssex");
            System.out.println(sid+"\t"+sname+"\t"+sage+"\t"+ssex);
        }
        
        dataSource.close();
    }
}

poco 连接池 mysql 连接池 数据库_三大连接池的区别_03