1、连接池介绍
在jdbc的基础上,我们发现来回的获得数据库连接返回数据库连接给数据库会大大降低数据库的执行效率。所以我们可以采用使用连接池的方式来放置连接、获取连接。当我们需要数据库连接的时候,我们不在向数据库获取,而是从连接池中获得数据库的连接,用完连接之后也不再返回给数据库,而是直接返回给连接池。这样数据库的效率的到很大的提升。
常用的数据库连接池有两种:DCBP、C3P0、HikariCP和Druid等。
2、HicariCP
Hikari是一款非常强大,高效,并且号称“史上最快连接池”。由于其性能方面比较好,并且在springboot2.0之后,采用的默认数据库连接池就是HikariCP,在引用parents后不用专门再添加依赖。
1)导入坐标
<!--默认的数据源(HicariCP)--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>
2)修改配置
spring: datasource: type: com.zaxxer.hikari.HikariDataSource#数据源的类型driver-class-name: com.mysql.cj.jdbc.Driver#数据源的驱动类型url: jdbc:mysql://localhost:3306/imoocuseUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai#数据源的连接地址username: root#数据源的用户名password: root#数据源的密码一些常用的配置选项hikari: #数据源的配置信息connection-timeout: 30000#等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException,默认:30秒minimum-idle: 5#最小连接数maximum-pool-size: 20#最大连接数auto-commit: true#自动提交idle-timeout: 600000#连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟pool-name: DateSourceHikariCP#连接池名字max-lifetime: 1800000#连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟1800000msconnection-test-query: SELECT1
3)优势
- 字节码精简:优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码;
- 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;
- 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描;
- 自定义集合类型(ConcurrentBag):提高并发读写的效率;
- 其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究(但没说具体怎么优化)。
3、Druid
1)导入坐标
导入对应的坐标(starter)
<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version></dependency></dependencies>
2)修改配置
修改配置,在数据源配置中有一个type属性,专用于指定数据源类型
spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?serverTimezone=UTCusername: rootpassword: root
注意观察,配置项中,在datasource下面并不是直接配置url这些属性的,而是先配置了一个druid节点,然后再配置的url这些东西,通过提示功能可以打开druid相关的配置查阅。
3)优势
Druid 相对于其他数据库连接池的优点:
- 强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况
- 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息。
- SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0~1毫秒区间50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况。
- 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等
- 方便扩展,Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。
- Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。
总结
- 整合连接池需要导入连接池对应的starter
- 根据连接池提供的配置方式进行配置
- 整合第三方技术通用方式
- 导入对应的starter
- 根据提供的配置格式,配置非默认值对应的配置项