数据库连接池原理

数据库连接池


数据库连接池原理:
1.当系统启动【初始化的时候】会创建5【可设置】个数据库初始连接
2.当客户请求到来的时候【用户要获取Connection对象的时候】
    2.1连接池中有空闲连接,直接将空闲的连接中的一个赋给客户使用
    2.2如果连接池中没有空闲连接了,而且连接的数据量没有超过最大数量,那么连接池会向数据库申请创建新的连接【5 可设        置】,然后交给客户使用
    2.3在2.2的情况下超过了最大连接数据,等待
3.当客户数据库操作完成后,这个连接怎么处理
    3.1连接池中的空闲连接数已经超过了初始连接数,那么直接销毁
    3.2连接池中的空闲连接数没有超过初始连接数据,那么进入空闲状态
    3.3如果有等待的用户,那么这个连接直接交给等待的用户使用

数据库连接池的概念:
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。

使用数据库连接池的流程:

使用数据库连接池的步骤:
第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。
优点:
        减少了网络开销
        系统的性能会有一个实质的提升
        没有TIME_WAIT状态

使用数据库连接池需配置几项参数:
最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.
最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作
最大空闲时间
获取连接超时时间
超时重试连接次数

常见的数据库连接池:
BDCP
C3P0
Druid
HikariCP

这里介绍下Druid的优点
强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况。
a. 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息;

b. SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0-1毫秒区间50次,1-10毫秒800次,10-100毫秒100次,100-1000毫秒30次,1-10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况;然后就可以对SQL语句进行优化

c. 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等。

方便扩展。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。
Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。

Druid的jar包下载连接:https://mvnrepository.com/artifact/com.alibaba/druid/1.0.20
以后对数据库的连接直接可以通过连接池对数据库连接进行管理,特别方便



举例代码如下

package com.zhouym.mvcpro.vo;

import java.sql.Connection;
import java.sql.SQLException;

import com.alibaba.druid.pool.DruidDataSource;

public class ConnPoolUtil {
    //创建数据库连接对象
    private static String URL = "jdbc:mysql://localhost:3306/demo?useSSL=true&useUnicode=true&characterEncoding=UTF-8";
    //创建驱动信息
    private static String DRIVER="com.mysql.jdbc.Driver";
    //创建数据库名称
    private static String USER="root";
    //创建数据库用户密码
    private static String PASSWORD="123456";
    //实例化一个数据源对象
    private static DruidDataSource dataSource = new DruidDataSource();
    
    //使用静态代码块为数据源对象初始化值
    static {
        //配置连接地址
        dataSource.setUrl(URL);
        //配置数据库用户名
        dataSource.setUsername(USER);
        //配置数据库用户密码
        dataSource.setPassword(PASSWORD);
        //记载驱动信息
        dataSource.setDriverClassName(DRIVER);
        //设置初始化连接大小
        dataSource.setInitialSize(10);
        //设置最大连接数
        dataSource.setMaxActive(20);
        //设置连接最大等待时间
        dataSource.setMaxWait(3000);
    }
    
    /**
     * 和数据库建立连接
     * @return 
     */
    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 关闭连接,调用这个close方法,是将连接回收到连接池中
     * @param conn 连接对象
     */
    public static void close(Connection conn) {
        if (conn!=null) {
            try {
                //将连接回收到连接池中
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    
}
————————————————
版权声明:本文为CSDN博主「zhouym_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhouym_/article/details/90611839

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值