数据库连接池
背景
传统方法:
Application -> JDBC -> DB
- 打开连接
- 使用
- 关闭连接
如果使用非常频繁, 不停打开和关闭, 都会对数据库性能造成影响. 连接数是有限的, 所以一直不归还, 也不行.
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', '女', ' 河北石家庄市');