连接池的作用

实际开发中”获取资源”和”释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享Connection连接。这样我们就不需要每次都创建连接和关闭连接了,这些操作都交给连接池。

连接池概念:管理Connection,重复使用使用Connection。调用close()不会关闭Connection,而是将Connection归还给连接池,使连接池可以重复使用Connection。
image.png
规范:
java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!**

c3p0连接池

c3p0是免费开源的连接池!使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件c3p0-config.xml。

使用步骤:

  1. 创建连接池对象(获取数据源)
  2. 必须设置的参数
    • DriverClass
    • url
    • username
    • password
  3. 设置其他参数
  4. 从连接池中获取连接对象 ```java package c3p0.demo.ba1;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException;

public class C3P0Demo1 { public static void main(String[] args) throws PropertyVetoException, SQLException { //1.创建连接池(获取数据源) ComboPooledDataSource dataSource = new ComboPooledDataSource(); //2.基本参数设置 dataSource.setDriverClass(“com.mysql.cj.jdbc.Driver”); dataSource.setJdbcUrl(“jdbc:mysql://localhost:3306/mydb”); dataSource.setUser(“root”); dataSource.setPassword(“root”); //3.设置其他参数 dataSource.setInitialPoolSize(5);//初始连接数 dataSource.setMinPoolSize(3);//最小连接数 dataSource.setMaxPoolSize(10);//最大连接数 dataSource.setAcquireIncrement(2);//每次增长的连接数 dataSource.setMaxIdleTime(30);//最大空闲时间-以秒为单位 - 当连接空闲时自动回收

  1. //从连接池中获取连接对象
  2. Connection conn = dataSource.getConnection();
  3. System.out.println(conn);
  4. }

}

<a name="Obq0a"></a>
## c3p0连接池 - 工具类

- **new ComboPooledDataSource(配置文件内的配置名称); - 使用配置文件给连接池传入参数**

**<br />配置文件:<br />注意:配置文件要放在src目录下
```java
<c3p0-config>

    <!-- 默认配置,如果没有指定则使用这个配置 -->
    <default-config>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydb</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="checkoutTimeout">30000</property>
        <property name="idleConnectionTestPeriod">30</property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
        <user-overrides user="test-user">
            <property name="maxPoolSize">10</property>
            <property name="minPoolSize">1</property>
            <property name="maxStatements">0</property>
        </user-overrides>
    </default-config> 

    <!-- 命名的配置 -->
    <named-config name="igeek">
        <!-- 连接数据库的4项基本参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/db</property>
        <property name="user">root</property>
        <property name="password">1234</property>
        <!-- 如果池中数据连接不够时一次增长多少个 -->
        <property name="acquireIncrement">5</property>
        <!-- 初始化连接数 -->
        <property name="initialPoolSize">20</property>
        <!-- 最小连接受 -->
        <property name="minPoolSize">10</property>
        <!-- 最大连接数 -->
        <property name="maxPoolSize">40</property>
        <!-- -JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量 -->
        <property name="maxStatements">0</property>
        <!-- 连接池内单个连接所拥有的最大缓存statements数 -->
        <property name="maxStatementsPerConnection">5</property>
    </named-config>
</c3p0-config>
package c3p0.demo.ba1;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Utils {
    //创建一个连接池
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

    //封装一个方法
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    //获取源数据,为了创建连接池的数据服务
    public static DataSource getSource(){
        return dataSource;
    }

    //测试
    public static void main(String[] args) throws SQLException {
        Connection conn = getConnection();
        System.out.println(conn);
        DataSource data = getSource();

    }
}

dbcp连接池

DBCP也是一个开源的连接池,是Apache Common(第三方非盈利组织)成员之一,tomcat内置的连接池。
dbcp连接池与c3p0的使用大同小异。但是配置文件不同。

dbcp的配置文件是properties格式。
properties文件不能编写中文,不支持在STS中修改,必须使用记事本修改内容,否则中文注释就乱码了。

dbcp-config.properties文件:

#基本配置内容
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
username=root
password=root

initialSize=10

maxActive=50

maxIdle=20

minIdle=5

maxWait=60000

connectionProperties=useUnicode=true;characterEncoding=UTF-8

defaultAutoCommit=true

defaultReadOnly=NONE

defaultTransactionIsolation=READ_UNCOMMITTED

dbcp连接池 - 工具类

package c3p0.demo.ba2;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * DBCP工具类 - 使用配置文件的形式
 */
public class DBCPUtils {
    //1.创建连接池
    private static DataSource dataSource;

    //2.使用静态代码块加载数据 - 获取配置文件中的数据
    static{
        try {
            //加载properties文件
            InputStream in =
                    DBCPUtils.class.getClassLoader()
                            .getResourceAsStream("dbcp-config.properties");
            Properties prop = new Properties();
            prop.load(in);//获取到流
            //通过工厂模式创建连接对象
            dataSource = BasicDataSourceFactory.createDataSource(prop);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    //获取连接对象
    public static Connection getConnectin() throws SQLException {
        return dataSource.getConnection();
    }

    //获取数据源
    public static DataSource getSource(){
        return dataSource;
    }

    //测试
    public static void main(String[] args) throws SQLException {
        Connection conn = getConnectin();
        System.out.println(conn);

        DataSource source = getSource();
        System.out.println(source);
    }
}