连接池学习

一、为什么需要连接池?

在传统的JDBC开发中,每次操作数据库都需要:

1.加载驱动 2.创建连接 3.执行SQL 4.关闭连接

缺点:需要自己创建连接和销毁连接,这样是比较消耗时间,资源等

有一些连接池,已经创建好了一些连接,现在可以从连接池中获取到,这样就节省创建连接时间,直接使用这些连接,归还到连接池中。

优点:

节省创建连接与释放连接,性能消耗

连接池中连接起到复用的作用,提升程序性能

二、连接池参数(池参数,如果不指定,有默认值)

初始大小:10个

最小空闲连接数:3个

增量:一次创建的最小单位(5个)

最大空闲连接数:12个

最大连接数:20个

最大的等待时间:1000毫秒

三、4个参数

任何的开源的连接池,4大参数都需要自己来设置

* 驱动的名称‐‐ com.mysql.jdbc.Driver

* 连接‐‐ jdbc:mysql:///day14

* 用户名‐‐ root

* 密码‐‐ root

四、DataSource 接口

SUN 公司定义了 javax.sql.DataSource 接口,所有连接池都必须实现它:

java 复制代码
public interface DataSource {
    Connection getConnection() throws SQLException;
}

开源连接池(DBCP、C3P0、Druid)都实现了该接口

通过 getConnection() 获取连接

调用 close() 方法时,底层被增强为归还连接而非销毁

五、主流连接池对比

连接池 特点
DBCP Apache 提供,轻量级
C3P0 支持自动回收空闲连接
Druid 阿里出品,功能最强,支持监控、SQL日志、加密

六、Druid 连接池实战

  1. 导入依赖
XML 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
</dependency>

2.编写测试程序

java 复制代码
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 测试连接池对象
*/
public class JdbcTest6 {
public static void main(String[] args) {
// 创建连接池对象,从连接池中获取到连接对象
DruidDataSource dataSource = new DruidDataSource();
// 设置4个参数 驱动类 地址 用户名 密码
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///jdbcdemo");
dataSource.setUsername("root");
dataSource.setPassword("root");
// 设置初始化连接个数,默认是0
dataSource.setInitialSize(5);
// 设置最大连接数
  dataSource.setMaxActive(10);
        // 最大等待时间,单位是毫秒 2秒
        dataSource.setMaxWait(2000);
 
        // 定义链接对象
        Connection conn = null;
        PreparedStatement stmt = null;
 
        try {
            // 获取到连接对象
            conn = dataSource.getConnection();
            // 编写SQL语句
            String sql = "insert into t_user values (null,?,?,?)";
            // 预编译SQL语句
            stmt = conn.prepareStatement(sql);
            // 设置值
            stmt.setString(1,"eee");
            stmt.setString(2,"eee");
            stmt.setString(3,"eee");
            // 执行sql
            stmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            // 释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    // 把conn关闭了,其实连接池的底层已经对close方法进行增强。原来是销毁连接,现在是归还连接。
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 
}
  1. 配置文件方式

druid.properties

XML 复制代码
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///jdbcdemo
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
maxIdle=6
minIdle=3

4.编写工具类

java 复制代码
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* JDBC的工具类 1.0版本
* JDBC的工具类 2.0版本(智能一些),编写properties属性文件,程序就可以读取属性文件
* JDBC的工具类 3.0版本,加入连接池对象
*/
public class JdbcUtils2 {
// 连接池对象
private static DataSource DATA_SOURCE;
static{
// 加载属性文件
Properties pro = new Properties();
InputStream inputStream = JdbcUtils2.class.getResourceAsStream("/druid.properties");
try {
// 加载属性文件
pro.load(inputStream);
// 创建连接池对象
DATA_SOURCE = DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从连接池中获取连接,返回。
* @return
*/
public static Connection getConnection(){
Connection conn = null;
 try {
            conn = DATA_SOURCE.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
 
    /**
     * 关闭资源
     * @param conn
     * @param stmt
     * @param rs
     */
    public static void close(Connection conn, Statement stmt, ResultSet rs){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * 关闭资源
     * @param conn
     * @param stmt
     */
    public static void close(Connection conn, Statement stmt){
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
               conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
 
}
相关推荐
罗光记5 分钟前
全能 Go Agent 框架 Covonaut v1.1.2发布:终端对话加入旁问与三档输出
数据库·经验分享·其他·百度·新浪微博
Htr_37 分钟前
Anysite.io 使用指南:把整个 Web 变成 AI 智能体的数据库
前端·数据库·人工智能
疯狂打码的少年40 分钟前
【计算机网络】IP地址与子网划分(IP地址分类与特殊地址)
网络·笔记·tcp/ip·计算机网络
CappuccinoRose43 分钟前
专项事件体系
前端·学习·网络状态·表单事件·剪贴板事件·拖放事件·页面可见性
bessyon1 小时前
从设备自购看医美机构的运营逻辑与竞争壁垒
笔记
(Charon)1 小时前
【Kafka】消息队列学习(一):为什么需要Kafka?从消息队列到整体架构
学习·架构·kafka
Lyra_Infra1 小时前
记一次麒麟 Linux 下达梦数据库 (DM8) 部署与 MySQL 命令行无界面迁移踩坑指南
数据库·后端·dba
晚安日记wanna1 小时前
只会答加索引MySQL 调优还能聊这 7 个点
数据库·面试
YHHLAI1 小时前
从零理解 Agent Memory 管理:内存记忆、文件持久化与上下文截断
数据库·oracle
cspttty1 小时前
2026市场分析师校招能力模型:SQL、Excel、BI与业务分析
大数据·数据库