相信学过jdbc的童鞋应该都对如下代码比较熟悉;
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&maxReconnects=100&failOverReadOnly=false&initialTimeout=10&zeroDateTimeBehavior=convertToNull","root","" ); //(url,user,password)
//获取操作数据库的预处理对象
PreparedStatement pstem = conn.prepareStatement("select * from student1");
//执行SQL,得到结果集
ResultSet rs = pstem.executeQuery();
//遍历结果集
while(rs.next()) {
System.out.println(rs.getString("name"));
}
//释放资源
rs.close();
pstem.close();
conn.close();
}
这是啥? 打开数据库链接,然后进行一次执行sql操作,然后关闭链接释放资源对吧? 有了这个util,我们就会方便很多,每次用java执行sql,都需要调用这个工具类即可,1 获取一个链接,执行sql 2 关闭链接;
但是实际上,这种经常开关链接的方式,其实是很浪费性能/资源的,频繁的开关比执行sql浪费的时间.性能要高得多!!!
于是连接池应运而生;
常见的连接池有 c3p0 boot项目默认支持的Hikari 以及阿里巴巴连接池 那么为什么用了连接池可以提升性能,是怎么提升的呢?
用了连接池的性能提升原因是,不在频繁开关数据库链接了;
提升关键是: 连接池在服务启动的时候,就开启了一定数量的链接,根据配置的数量开启,然后一直维护着这些链接,存储在连接池中,每次java程序执行sql,都会去连接池中取到一个链接,执行,然后并不调用close释放该链接,而是将 该链接重新放回连接池中,这样就不会频繁开关数据库的链接了;这就是连接池的工作原理;
连接池常用的配置参数一览; 这些参数其实不是随便配置的,都是有参考标准的;
以druid阿里巴巴 数据库连接池组件为例。
spring:
datasource:
# 数据源基本配置
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_crud
type: com.alibaba.druid.pool.DruidDataSource
# 数据源其他配置
druid:
# 配置初始化大小、最小、最大线程数
initialSize: 5
minIdle: 5
# CPU核数+1,也可以大些但不要超过20,数据库加锁时连接过多性能下降
maxActive: 20
# 最大等待时间,内网:800,外网:1200(三次握手1s)
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最大空间时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
# 设置从连接池获取连接时是否检查连接有效性,true检查,false不检查
testOnBorrow: true
# 设置从连接池归还连接时是否检查连接有效性,true检查,false不检查
testOnReturn: true
# 可以支持PSCache(提升写入、查询效率)
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
# 保持长连接
keepAlive: true
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
