连接池
HikariCP
HikariCP很快的原因:
1)字节码级别优化(很多方法通过JavaAssist生成)
2)大量小改进
- 用FastStatementList代替ArrayList
- 无锁集合 ConcurrentBag
- 代理类的优化(比如,用 invokestatic 代替了 invokevirtual)
在Spring Boot 中的配置:
Spring Boot 2.x
- 默认使用 HikariCP
- 配置 spring.datasource.hikari.* 配置
常用HikariCP配置参数:
常用配置
# 最大的数据库连接池的大小
spring.datasource.hikari.maximumPoolSize=5
# 最小的空闲连接个数
spring.datasource.hikari.minimumIdle=5
# 空闲连接的超时
spring.datasource.hikari.idleTimeout=600000
# 连接的超时
spring.datasource.hikari.connectionTimeout=30000
# 每个连接最大存活多久
spring.datasource.hikari.maxLifetime=1800000
其他配置详见 HikariCP 官网:
- https://github.com/brettwooldridge/HikariCP
Alibaba Druid
1.官方介绍:
Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Logging能诊断Hack应用行为。
2.Druid实用的功能:
- 详细的监控
- ExceptionSorter,针对主流数据库的返回码都有支持
- SQL防注入
- 内置加密配置
- 众多扩展点,方便进行定制【通过Druid Filter来实现】
3.数据源配置
1)直接配置 DruidDataSource
2)通过 druid-spring-boot-starter
- spring.datasource.druid.*
spring.datasource.url=jdbc:h2:mem:foo
spring.datasource.username=sa
spring.datasource.password=n/z7PyA5cvcXvs8px8FVmBVpaRyNsvJb3X7YfS38DJrIg25EbZaZGvH4aHcnc97Om0islpCAPc3MqsGvsrxVJw==
# 初始连接池大小
spring.datasource.druid.initial-size=5
# 最大活跃数
spring.datasource.druid.max-active=5
# 最小空闲数
spring.datasource.druid.min-idle=5
spring.datasource.druid.filters=conn,config,stat,slf4j
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
spring.datasource.druid.filter.config.enabled=true
# 获取连接时做检查
spring.datasource.druid.test-on-borrow=true
# 归还连接时做检查
spring.datasource.druid.test-on-return=true
# 空闲连接时做检查
spring.datasource.druid.test-while-idle=true
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALS8ng1XvgHrdOgm4pxrnUdt3sXtu/E8My9KzX8sXlz+mXRZQCop7NVQLne25pXHtZoDYuMh3bzoGj6v5HvvAQ8CAwEAAQ==
Filter配置
- spring.datasource.druid.filters=conn,config,stat,slf4j (全部使用默认值)
密码加密
spring.datasource.password=<加密密码>
spring.datasource.druid.filter.config.enabled=true
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=<public-key>
SQL防注入
spring.datasource.druid.filter.wall.enabled=true
# 指定数据库类型
spring.datasource.druid.filter.wall.db-type=h2
# 不允许delete操作
spring.datasource.druid.filter.wall.config.delete-allow=false
# 不允许drop table操作
spring.datasource.druid.filter.wall.config.drop-table-allow=false
# 注:也可以在DB的配置上去封禁这些
4.Druid Filter
- 用于定制连接池操作的各种环节
- 可以继承 FilterEventAdapter 以便方便地实现Filter
- 修改 META-IINF/druid-filter.properties 增加 Filter配置
注意:在引入Druid依赖时,一定要把HikariCP排除,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<artifactId>HikariCP</artifactId>
<groupId>com.zaxxer</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
5.连接池选择时的考量
- 可靠性
- 性能
- 功能
- 可扩展性
- 可运维性
- 其他
社区是否活跃、作者是否修改。。。
学习文档:极客时间-玩转Spring全家桶