数据库连接池
数据库连接池原理:
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