「SpringBoot-DAO」 数据库连接池

Posted by Dawn-K's Blog on July 2, 2020

数据库连接池

背景

传统方法: Application -> JDBC -> DB

  1. 打开连接
  2. 使用
  3. 关闭连接

如果使用非常频繁, 不停打开和关闭, 都会对数据库性能造成影响. 连接数是有限的, 所以一直不归还, 也不行.

pool

pool : 池 池的技术可以起到一个缓冲的作用

最大连接数: 500(上限, 池中最多有500个, 多出来的应用排队等待) 默认(最小)连接数: 10(实际上是开始关闭连接的阈值, 也就是低于10个链接的时候, 即使空闲, 也不会释放) 现在的方法: Application -> pool -> JDBC -> DB 面对申请, 如果连接池有空闲的, 直接分配. 如果没有的话, 就去申请(如果已经到达上限后就不会申请). 应用使用完之后, 就会归还到池. 如果池中大于默认链接数, 就会把多余的释放.

当然, 部分数据库链接池的设计是初始就给创建好若干个.

HikariCP

Spring 连接池已经换成了 HikariCP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
server.port=8888
# JDBC连接数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 注意这里的iotManager需要修改,而且在mysql8.+必须要指定失去
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/iotManager?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai
# 用户名和密码
spring.datasource.username=root
spring.datasource.password=1234
# 数据库连接池
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# 最小空闲连接数量
spring.datasource.hikari.minimum-idle=5
# 连接池最大连接数,默认是10
spring.datasource.hikari.maximum-pool-size=15
#此属性控制从池返回的连接的默认自动提交行为,默认值:true
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=UserHikariCP
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
spring.datasource.hikari.max-lifetime=1800000
#数据库连接超时时间,默认30秒,即30000
spring.datasource.hikari.connection-timeout=30000
#指定校验连接合法性执行的sql语句
spring.datasource.hikari.connection-test-query=SELECT 1

# 下面是重点    
#=classpath*:mapper/**/*.xml
mybatis.mapper-locations=classpath*:/mapper/*.xml
# 下面这个包名不加也罢
mybatis.type-aliases-package=com.xtsz.entity

JDBC

MyBatis 是一种半映射, 只要求SQL+JAVA, 学习成本低

Mapper 是个xml文件, 在其中放sql语句, mapper提供映射, 能够将sql和java代码进行转换

数据库初始化样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE DATABASE his_db DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
use his_db;

/* 用户信息表 */
CREATE TABLE USER
(
    id       int         NOT NULL auto_increment COMMENT '用户ID',
    username varchar(20) not null COMMENT '用户账号',
    birthday varchar(20) not null COMMENT '出生年月',
    sex      varchar(6)  not null COMMENT '性别',
    address  varchar(30) COMMENT '地址',
    PRIMARY KEY ( `id` )
) COMMENT ='用户表' ENGINE = InnoDB
                 DEFAULT CHARSET = utf8
                 AUTO_INCREMENT = 1;

/* 用户表的模拟数据 */
insert into USER(username, birthday, sex, address)
values ('zhangsan', '1990-05-03', '男', '天津市滨海区'),
       ('lishui', '1903-05-01', '女', '河北省张家口市'),
       ('wangwu', '1900-08-01', '女', '河北石家庄市'),
       ('zhaoliu', '1900-08-01', '女', ' 河北石家庄市');