数据库连接池

1. 概念

数据库连接池用来管理 Connection, 这样可以重复使用 Connection. 有了池, 所以我们就不用自己来创建
Connection 对象, 而是通过池来获取 Connection 对象. 当使用完 Connection 后, 调用 Connection
的 close() 方法也不会真的关闭 Connection, 而是把 Connection "归还"给池.

2. 连接池特点

  • 连接池必须实现 javax.sql.DataSource 接口(JavaSE 文档)
  • 连接池返回的 Connection 对象, 它的 close() 方法是把连接归还给池!! 而不是关闭连接.

2. DBCP 连接池

2.1 所需 jar 包

  • commons-dbcp;
    • commons-pool;
    • mysql-connector-java;

2.2 使用步骤

  • 创建连接池对象;
  • 配置四大参数;
  • 配置池参数;
  • 得到连接对象;
// 创建连接池对象
BasicDataSource dataSource = new BasicDataSource();

// 配置四大参数
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb1");
dataSource.setUsername("root");
dataSource.setPassword("root");

// 配置池参数 (可选)
dataSource.setMaxTotal(20);  // 最大连接数
dataSource.setMinIdle(3);  // 最小空闲连接
dataSource.setMaxWaitMillis(1000); // 最长等待时间

// 得到连接对象
Connection con = dataSource.getConnection();

2.3 原理

DBCP 连接池内部使用四大参数创建了连接对象! 即 MySQL 驱动提供的 Connection 对象.
连接池对 MySQL 的连接对象进行了装饰, 只对 close() 方法进行了增强!!
装饰之后的 Connection 的 close() 方法, 用来把当前连接归还给池!!而不是销毁连接.

3. c3p0 连接池

3.1 所需 jar 包

  • c3p0-0.9.2
  • mchange-commons
  • mysql-connector-java
// 创建连接池对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();

// 对池进行四大参数的配置
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");
dataSource.setUser("root");
dataSource.setPassword("root");

// 池参数配置 (可选)
dataSource.setAcquireIncrement(5); // 每次的增量
dataSource.setInitialPoolSize(20); // 初始化连接数
dataSource.setMinPoolSize(2); //最少连接数
dataSource.setMaxPoolSize(50); //最多连接数

// 得到连接对象
Connection con = dataSource.getConnection();

3.2 c3p0 配置文件

  • c3p0 也可以指定配置文件, 而且配置文件可以是 properties, 也可以是 xml.如果是 xml, 配置文件名
    必须为 "c3p0-config.xml",并且必须放在 "src" 目录下.
// c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="acquireIncrement">3</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">10</property>
    </default-config>
</c3p0-config>


// 使用配置文件中的默认配置信息,得到 Connection

    ComboPooledDataSource dataSource = new ComboPooledDataSource();

    Connection con = dataSource.getConnection();

参考资料:

原文地址:https://www.cnblogs.com/linkworld/p/7625202.html