今天主要介绍几款常见的数据库连接池 并且对它们的使用做一个总结,本篇文章是以SpringBoot 项目为例,一起随着小编看一下吧!
在文章的开始,提出一个问题:
一.为什么要使用数据库连接池?
影响一个系统使用感受的因素是方方面面的,比如 电脑配置,业务逻辑代码写的低效率,又或者数据渲染过慢,其中都是以数据为一个中间点,提到数据必然会想到数据库。
试想一下,用户的每一次访问,我们都创建一个连接,用完后就关闭它,使用频率不高的这样也是能够接受的,但是对于一个运行系统来说是有点负担的,因为运行系统对数据的操作比较频繁,频繁开启,关闭 数据库连接,会极大的降低系统的性能,从而引发一些潜在的问题。
数据库连接池是什么?
数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回的方法。
这样做的好处:
连接复用【数据库连接池提供了一套高效的连接分配.使用策略. 最终实现连接的高效】
更快的响应速度
统一的连接管理,避免数据库连接泄露
连接池的工作原理:
引自:戳这里
连接池的参数:
二.JDBC 数据库连接池
最开始学习Java 的时候,那个时候还没用连接池,用的是JDBC ,已经好久没有写过这些代码了,随着小编一起回顾一下知识吧
数据库表结构:
package com.test.nodefault;
import java.sql.*;
/**
* @Author tanghh
* @Date 2020/3/17 14:49
* 数据库Jdbc 的连接
*/
public class JdbcTest {
public static void main(String[] args) {
String userName = "root";
String password = "root";
String url = "jdbc:mysql://192.168.20.81:3306/main_config";
String sql = "select * from linkman";
try {
//1.加载Jdbc 的驱动
Class.forName("com.mysql.jdbc.Driver");
//2.提供jdbc连接的url,创建数据库的连接。
Connection connection = DriverManager.getConnection(url, userName, password);
//3. 创建Statement
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//4.执行sql 语句
ResultSet rs = preparedStatement.executeQuery();
//5.处理结果
while (rs.next()) {
System.out.println("id : " + rs.getInt(1) + " linkman_name : " + rs.getString(2) );
}
//6.使用完连接对象以后,记得关闭流
// 关闭记录集
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭声明
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭连接对象
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
效果如下:
三.几大数据库连接池比较
测试性能这块不在本篇文章的讨论范围之内,先总结一下几大连接池的区别
c3p0
在小编学习ssm 框架的时候,我们使用的就是c3p0, 优点是功能简单易用,稳定性好。 缺点就是性能差,由于其架构设计过于复杂,重构成了一件很难的事,因此性能上的缺点,让它失去了大多数用户的使用。
dbcp
DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目。
DBCP通过连接池预先同数据库建立一些连接放在内存中(即连接池中),应用程序需要建立数据库连接时直接到从接池中申请一个连接使用,用完后由连接池回收该连接,从而达到连接复用,减少资源消耗的目的。这个我没怎么用过,不做过多展开,用兴趣的可以去了解一下。
HikariCP
HikariCP号称“性能杀手” ,具体可参考:戳这
Druid
中文文档比较齐全,它的优点在于强大的监控功能,可以清楚的知道 连接池和SQL的工作情况,方便扩展。
对这几个测试总结:
性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0
uid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性
综合以上我们目前系统用的是阿里巴巴的数据库连接池 druid
四.阿里巴巴数据库连接池
(1)首先在pom 文件中引入Jar 包
<!-- druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
在配置参数的类中加入一些参数:
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=50
# 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
#spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
spring.datasource.useGlobalDataSourceStat=true
package com.bos.util;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DruidConfiguration {
@Bean
public ServletRegistrationBean statViewServlet(){
//创建servlet注册实体
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
//设置ip白名单
servletRegistrationBean.addInitParameter("allow","127.0.0.1");
//设置ip黑名单,如果allow与deny共同存在时,deny优先于allow
servletRegistrationBean.addInitParameter("deny","192.168.0.19");
//设置控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername","root");
servletRegistrationBean.addInitParameter("loginPassword","123123");
//是否可以重置数据
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean statFilter(){
//创建过滤器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//设置过滤器过滤路径
filterRegistrationBean.addUrlPatterns("/*");
//忽略过滤的形式
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
在浏览器上访问:
五.参考文章:
数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)
以上只是小编的一点小总结,等了解的比较深刻以后再不断完善,如果您觉得写得不错的话,不妨给小编一个免费的赞吧!