Skip to content

自定义连接池

前置条件

  1. 连接池必须实现javax.sql.DataSource接口
  2. 连接池返回的Connection对象,它的close()不是关闭连接而是把连接归还到连接池

模板

java
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;

public class MyDataSource implements DataSource {
    // 创建一个集合用于保存连接
    LinkedList<Connection> list = new LinkedList<>();

    // 构造循环创建10条连接存入集合
    public MyDataSource() {
        for (int i = 0; i < 10; i++) {
            try {
                list.add(JdbcUtils.getConnection());
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

    // 调用close方法归还连接
    public void close(Connection connection) {
        list.add(connection);
        System.out.println("还剩" + list.size());
    }

    // 获取连接
    @Override
    public Connection getConnection() {
        Connection connection = list.removeFirst();
        System.out.println("还剩" + list.size());
        return connection;
    }
	
    // @Override···
}

druid(德鲁伊)连接池

项目地址:https://github.com/alibaba/druid

Maven项目

xml
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.20</version>
</dependency>

测试连接是否有效

java
public void testGetConnection() throws SQLException {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/数据库名");
    dataSource.setUsername("数据库账号");
    dataSource.setPassword("数据库密码");
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
}

配置文件(druid.properties)

properties
# 驱动
driverClassName=com.mysql.jdbc.Driver
# 连接数据库的连接
url=jdbc:mysql://localhost:3306/数据库名
# 数据库用户户名
username=数据库账号
# 数据库密码
password=数据库密码
# 初始连接数
initialSize=5
# 最大连接池数量
maxActive=10
# 最小连接池数量
minIdle=1
# 最大等待时间(毫秒)
maxWait=3000

用于德鲁伊连接池的常用配置

封装DruidUtils的工具类

java
public class DruidUtils {
    private static DataSource dataSource;

    // 创建连接池
    static {
        try {
            // 获取流
            InputStream resourceAsStream = DruidUtils.class.getResourceAsStream("druid.properties");
            Properties properties = new Properties();
            // 加载配置文件
            properties.load(resourceAsStream);
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 获取连接池对象
    public static DataSource getDataSource() {
        return dataSource;
    }

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

    // 释放资源
    public void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection) {
        if (resultSet != null)
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        if (resultSet != null)
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        if (connection != null)
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
    }

    public void close(PreparedStatement preparedStatement, Connection connection) {
        close(null, preparedStatement, connection);
    }
}

SpringBoot3 整合

pom依赖

xml
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid-spring-boot-3-starter</artifactId>
  <version>1.2.20</version>
</dependency>

编写yml配置文件

yaml
spring:
  datasource:
  	# 使用Druid连接池
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysql.sqlpub.com:3306/xxx
    username: 
    password: 
    # 编写Druid配置
    druid:
      # 初始化连接数
      initial-size: 8
      # 最大连接数
      max-active: 16
      # 最小空闲数量
      min-idle: 8
      # 连接时最大等待事件(毫秒)
      max-wait: 60000
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false