MySQL | 数据库连接池

MySQL | 数据库连接池

基本概念

从之前我们使用 JDBC 的情况看,虽然抽取了工具类,但是每次对数据库的操作都会重新获取一次连接,操作完毕后,再释放资源,这无疑会对性能有较大消耗。数据库连接池就是一个存放数据库连接的容器,该容器被创建时,会申请一些连接对象,当用户访问数据库时,从容器中获取连接对象(而不是申请新的连接),用户访问完之后,会将连接对象归还给容器(而不是归还给系统)。

数据库连接池

使用数据库连接池可以节约系统资源,提高用户访问的效率。

javax.sql 包提供了连接池标准接口 DataSource

  • 获取连接:getConnection()
  • 关闭连接:Connection.close()。如果连接对象 Connection 是从连接池中获取的,那么调用 Connection.close() 方法,则不会再关闭连接了,而是归还至连接池

Druid 数据库连接池

Druid 是由阿里巴巴提供的数据库连接池实现技术。使用方法如下

  1. 导入 Druid 的 jar 包(文章尾部有下载地址)
  2. 定义配置 .properties 文件,文件名可随意
  3. 加载配置文件
  4. 通过连接池工厂类获取连接池对象
  5. 通过连接池对象获取连接

Druid 连接池配置文件 druid.properties,放在 Module(Project)/src/ 目录下

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username=root
password=root
initialSize=10
maxActive=15
maxWait=3000
validationQuery=SELECT 1

使用连接池的 JDBC 工具类

package cool.yzt.datasource.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @Author: yzt
 * @Description: 使用连接池的 JDBC 工具类
 */
public class JDBCUtiles {
    // 数据库连接池对象
    private static DataSource ds;

    static {
        try {
            Properties pros = new Properties();
            // 加载配置文件
            pros.load(JDBCUtiles.class.getClassLoader().getResourceAsStream("druid.properties"));
            // Druid 提供的工厂类获取连接池,参数为保存着连接池配置信息的Properties对象
            ds = DruidDataSourceFactory.createDataSource(pros);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    public static void close(Statement statement,Connection connection) {
        close(null,statement,connection);
    }

    // 关闭连接,因为是从连接池获取的连接,资源会归还至连接池
    public static void close(ResultSet rs,Statement statement, Connection connection) {
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(statement!=null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(connection!=null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static DataSource getDataSource() {
        return ds;
    }
}

测试工具类

package cool.yzt.datasource.druid;

import cool.yzt.datasource.utils.JDBCUtiles;
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * @Author: yzt
 * @Description: 测试
 */
public class DruidDemo {
    public static void main(String[] args) {

        Connection connection = null;
        PreparedStatement preparedStatement = null;

        try {
            // 获取连接
            connection = JDBCUtiles.getConnection();

            String sql = "insert into emp values (null,?,?,?,?,?)";

            preparedStatement = connection.prepareStatement(sql);

            preparedStatement.setString(1,"紫霞仙子");
            preparedStatement.setString(2,"女");
            preparedStatement.setInt(3,10000);

            java.util.Date date = new java.util.Date();
            try {
                // 通过解析字符串获取 java.util.Date 对象
                date = new SimpleDateFormat("yyyy-MM-dd").parse("2020-05-20");
            } catch (ParseException e) {
                e.printStackTrace();
            }
            // 这里入参的 Date 对象是 java.sql.Date 对象,该对象的参数是时间戳
            preparedStatement.setDate(4,new Date(date.getTime()));
            preparedStatement.setInt(5,3);

            int count = preparedStatement.executeUpdate();
            System.out.println(count);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 归还连接
            JDBCUtiles.close(preparedStatement,connection);
        }
    }
}

参考

黑马 JavaWeb
数据库复习笔记

使用的 jar 包
Druid 数据库连接池

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://yzt.cool/archives/mysql数据库连接池