一.简介
数据库连接池是一种用于管理数据库连接的技术,主要用于提高数据库访问的性能和可扩展性。当一个应用程序需要访问数据库时,它通常会建立一个数据库连接,执行相应的操作后,关闭该连接。如果在短时间内需要多次访问数据库,那么建立和关闭数据库连接的开销会很大,同时也会占用数据库服务器的资源。
连接池的作用就是预先建立一定数量的数据库连接,并将这些连接缓存起来,当应用程序需要访问数据库时,直接从连接池中获取一个可用的连接,并在使用完毕后将其释放回连接池,而不是每次都重新建立和关闭连接。这样可以减少连接的创建和关闭开销,提高数据库访问的性能和可扩展性。
编辑
使用连接池可省略灰色部分的流程
连接池通常包含以下几个部分:
- 连接池管理器:管理连接池的创建、初始化、销毁等操作。
- 连接池:包含一组数据库连接,并负责对这些连接进行管理,包括分配和释放连接等操作。
- 连接对象:表示与数据库建立的连接,包括连接参数、状态等信息。
- 连接池状态监控:用于监控连接池的状态和性能指标,以及检测连接池中的异常连接等情况。
常见的Java连接池有:
- Apache Commons DBCP:由Apache软件基金会开发的连接池,具有较好的稳定性和性能,支持连接池缓存和预处理语句等功能。
- C3P0:一款开源的连接池实现,具有较好的稳定性和可靠性,支持连接池缓存和自动管理连接等功能。性能略差。
- HikariCP:一款轻量级的高性能连接池,具有快速启动和快速恢复等特点,适合高并发场景。
- Druid:阿里巴巴开源的连接池,具有监控和统计、自动关闭空闲连接、可扩展的插件等功能。
使用连接池可以提高应用程序的性能和可靠性,减少数据库连接的建立和断开开销,减少数据库负载,同时也可以有效地避免一些数据库连接的错误。
二.如何使用
在Spring Boot中,可以通过在pom.xml文件中添加相关的依赖来使用数据库连接池。常用的数据库连接池有Apache Commons DBCP、HikariCP和Tomcat JDBC等,其中HikariCP是目前性能最好的连接池,也是Spring Boot 2.x默认的连接池。
在Spring Boot中,可以使用application.properties或application.yml配置文件来配置数据源和连接池。以下是一个application.properties文件的示例:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver //驱动程序类名
spring.datasource.type=com.zaxxer.hikari.HikariDataSource //连接池类型
spring.datasource.hikari.maximum-pool-size=10 //最大连接数
连接池具体参数:
- 最大连接数(maxActive):连接池中最大连接数,超过此数的连接将被阻塞。一般来说,应该根据数据库的最大连接数来设置此值,避免因连接过多导致数据库出现性能问题。
- 最小空闲连接数(minIdle):连接池中最小空闲连接数,当连接池中的连接数少于此数时,连接池会创建新的连接。
- 最大空闲连接数(maxIdle):连接池中最大空闲连接数,当连接池中的连接数超过此数时,多余的连接将被关闭。
- 连接最大空闲时间(maxIdleTime):连接在池中保持空闲的最大时间,超过此时间的空闲连接将被关闭。此参数可以避免因为长时间没有使用而导致的连接失效。
- 连接最大生存时间(maxLifetime):连接在池中最大的生存时间,超过此时间的连接将被关闭。此参数可以避免因为长时间运行而导致的连接失效。
- 等待连接超时时间(maxWaitTime):连接池中没有空闲连接时,获取连接的等待时间,超过此时间会抛出异常。
- 验证连接是否可用(testOnBorrow):连接是否可用的验证方式,如果设置为true,每次从连接池中获取连接时都会验证连接是否可用。如果验证失败,则连接池会尝试创建新的连接。
- 验证连接是否可回收(testOnReturn):连接是否可回收的验证方式,如果设置为true,每次将连接放回连接池时都会验证连接是否可用。如果验证失败,则连接池会尝试创建新的连接。
druid连接池配置
datasource:
druid:
# Druid连接池监控配置
stat-view-servlet:
# 是否开启Druid连接池监控功能,默认为false,设置为true时开启。
enabled: true
# Druid监控页面登录用户名。
loginUsername: admin
# Druid监控页面登录密码。
loginPassword: 123456
dynamic:
# 动态数据源配置
druid:
# 连接池初始化大小。
initial-size: 5
# 连接池最小空闲连接数
min-idle: 5
# 连接池最大连接数
maxActive: 20
# 连接池获取连接的最大等待时间,单位为毫秒
maxWait: 60000
# 空闲连接检测周期,单位为毫秒
timeBetweenEvictionRunsMillis: 60000
# 连接空闲时间,超过该时间的空闲连接将被回收。
minEvictableIdleTimeMillis: 300000
# 用于检测连接是否有效的SQL语句。
validationQuery: SELECT 1 FROM DUAL
# 是否在空闲时检查连接的可用性。
testWhileIdle: true
# testOnBorrow: 是否在获取连接时检查连接的可用性。
testOnBorrow: false
# 是否在归还连接时检查连接的可用性。
testOnReturn: false
# 是否缓存PreparedStatement。
poolPreparedStatements: true
# 缓存PreparedStatement的最大数量。
maxPoolPreparedStatementPerConnectionSize: 20
# 连接池拦截器,可以对连接池的连接进行监控、统计和防御SQL注入攻击等。
filters: stat,wall,slf4j
# 连接池的其他属性配置,比如是否合并SQL、慢查询的阈值等。
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000