目录
1.数据库连接池
数据库连接池是一种数据库连接的管理方式,它让系统在数据库上保持一定数量的连接,当系统有访问数据库的请求时,可以快速地从连接池中获取一个数据库连接来用,用完后再返回给连接池,而不是再次创建一个新的数据库连接。
数据库连接池是个容器,负责分配、管理数据库连接(Connection)。
数据库连接池有以下优点:
- 提高连接效率:因为不需要每次请求数据库时都重新建立连接,所以连接速度更快。
- 节省资源:由于连接是复用的,可以节省系统资源,例如减少内存的使用。
- 减少连接次数:减少了频繁建立和关闭连接的次数,可以减轻数据库服务器的压力。
- 改善系统响应时间:由于连接建立的时间减少,请求数据库的响应时间也会减少。
数据库连接池的缺点包括:
- 增加了系统的复杂性:需要对连接池进行管理和配置,例如控制最小和最大连接数,处理空闲连接的回收等。
- 可能出现资源泄露:如果没有合适的监控和管理,连接池可能会导致系统资源泄露,例如内存泄露。
2.没有使用数据库连接池
客户端执行SQL语句:要先创建一个新的连接对象,然后执行SQL语句,SQL语句执行后又需要关闭连接对象从而释放资源,每次执行SQL时都需要创建连接、销毁链接,这种频繁的重复创建销毁的过程是比较耗费计算机的性能。
3.数据库连接池的原理
程序在启动时,会在数据库连接池(容器)中,创建一定数量的Connection对象
允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句
执行完之后,释放Connection时就会把Connection对象归还给连接池(Connection对象可以复用)
数据库连接池是如何知道用户长时间没有使用Conllection对象的?
释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏。
客户端获取到Connection对象了,但是Connection对象并没有去访问数据库(处于空闲),数据
库连接池发现Connection对象的空闲时间 > 连接池中预设的最大空闲时间,此时数据库连接池
就会自动释放掉这个连接对象
常见的数据库连接池:
C3P0
DBCP
Druid
Hikari (springboot默认)
现在使用更多的是:Hikari、Druid(性能更优越)
4.演示Druid数据库连接池的使用
1.SpringBoot项目就引入依赖
<dependency>
<!-- Druid连接池依赖 -->
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
2.在Springboot项目配置
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
driver-class-name: com.mysql.cj.jdbc.Driver
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 30000
min-evictable-idle-time-millis: 60000
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
参数说明:
1. 数据库连接配置
url
:jdbc:mysql://localhost:3306/mydb
- 数据库的 JDBC URL,指定了数据库的位置和要连接的数据库名称。
username
:root
- 连接数据库时使用的用户名。
password
:secret
- 连接数据库时使用的密码。
driver-class-name
:com.mysql.cj.jdbc.Driver
- JDBC 驱动的类名,用于连接 MySQL 数据库。
2. 连接池配置
initial-size
:5
- 连接池初始化时创建的连接数。这个参数决定了连接池在启动时创建的初始连接数。
min-idle
:5
- 连接池中最小的空闲连接数。即使连接池中没有请求,连接池也会保持至少
min-idle
个空闲连接。
- 连接池中最小的空闲连接数。即使连接池中没有请求,连接池也会保持至少
max-active
:20
- 连接池中允许的最大活跃连接数。当连接池中活跃连接的数量达到这个值时,后续的连接请求会被阻塞或抛出异常。
max-wait
:60000
- 连接池中获取连接的最大等待时间(单位:毫秒)。如果在这个时间内没有获取到连接,将抛出异常。
time-between-eviction-runs-millis
:30000
- 定期检测连接池中的空闲连接的间隔时间(单位:毫秒)。这个参数指定了空闲连接检测的频率。
min-evictable-idle-time-millis
:60000
- 空闲连接的最小生存时间(单位:毫秒)。连接在空闲状态下保持的最短时间,低于这个时间的空闲连接会被移除。
test-while-idle
:true
- 是否在空闲连接时进行测试。如果为
true
,连接池在检测空闲连接时会验证连接是否有效。可以防止返回无效的连接。
- 是否在空闲连接时进行测试。如果为
test-on-borrow
:false
- 是否在获取连接时进行测试。如果为
true
,连接池会在借出连接前进行测试,确保连接有效。
- 是否在获取连接时进行测试。如果为
test-on-return
:false
- 是否在归还连接时进行测试。如果为
true
,连接池会在连接被归还时进行测试,确保连接有效。
- 是否在归还连接时进行测试。如果为
pool-prepared-statements
:true
- 是否启用 PreparedStatement 的池化。如果为
true
,连接池会池化 PreparedStatement 对象,从而提高性能。
- 是否启用 PreparedStatement 的池化。如果为
这些配置参数可以帮助你根据具体的应用需求和数据库负载调整 Druid 连接池的行为,以优化性能和稳定性。