一、背景介绍
在之前的文章中,我们介绍了 ORM 框架相关的使用方式,这些框架其实都有一个显著的特点,那就是会经常跟数据库打交道。
熟悉 JDBC 的同学可能知道,用 Java 来操作数据库,通常需要先创建一个数据库连接,然后通过这个连接来执行相关的 SQL 语句,当执行完毕之后需要再次手动释放连接。每当来一个涉及数据库的业务操作时,都需要经历同样的操作步骤,示例如下:
当请求量不高的时候,这种模式不会存在很大的问题,可以正常提供服务,但是当请求量超过 1000 的时候,可能数据库连接数就不够用了,请求创建数据库连接的客户端会直接报错。
为了解决数据库连接数不够用的问题,于是诞生了数据库连接池。其核心思想是:用户需要访问数据库时,并非创建一个新的连接,而是从连接池中取出一个已建立的空闲连接对象,使用它来访问和操作数据库;当用户访问数据库完毕之后,也并非将连接关闭掉,而是将连接对象还回到连接池中,以便下一个请求访问使用,实现连接复用的效果。
事实上,也确实如此,通过连接池来管理数据库的连接,可以有效的提高数据库访问效率,降低连接异常,提升系统响应速度等。
目前,市面上开源的数据库连接池框架非常的多,下面,我们列举几个比较知名的 JDBC 开源连接池组件,简要的了解一下它们的发展历史。
- C3P0:一款很古老的 JDBC 连接池,因作为 Hibernate 框架内置的数据库连接池而被开发者所熟知,但是由于性能较差,且代码复杂度很高,官方已经放弃维护
- DBCP:由 Apache 开发的一个 Java 数据库连接池项目,Tomcat 默认使用的连接池组件,采用单线程来操作连接,性能不好,能支持的并发量低,逐渐被淘汰
- Tomcat Jdbc Pool:这个数据库连接池可以看作是 DBCP 的升级版,它支持异步方式获取连接,在高并发应用环境下依然保存较好的效果,Tomcat 7及以后默认的连接池组件
- BoneCP:一款高效、免费的 JDBC 连接池,BoneCP 号称是最快的连接池框架,不过从 2013 年后不再更新,稳定性不佳
- Druid:阿里出品的一个数据库连接池,功能比较全面,有着高可用且扩展较好的特点,同时还自带监控服务,国内流行度非常高
- HikariCP:数据库连接池的一个后起之秀,在 BoneCP 基础上开发的一个高性能的 JDBC 连接池,号称性能最好,目前已作为 SpringBoot2 默认的数据库连接池组件
从实际的性能测试来看,排名如下:HikariCP > Druid > tomcat-jdbc > dbcp > c3p0。其中HikariCP的性能最好,这主要得益于它采用最大限度的避免锁竞争的处理思路,进一步加快了连接池的处理效率。
其次,Druid 功能最为全面,比如支持 SQL 拦截、慢 SQL 监控等,同时具有良好的扩展性,性能也不错。
总的来看,如果追求高性能,可以选择 HikariCP 连接池;如果看中更多的功能支持,可以选择 Druid。
下面我们一起来看看这两款连接池的具体应用方式。
二、HicariCP
在此,我们介绍两种方式来完成 HicariCP 连接池的配置初始化,以便于对它的使用有更清晰的理解。
- 第一种:通过自定义配置文件加载 HicariCP
- 第二种:SpringBoot 整合 HicariCP
2.1、自定义配置文件加载 HicariCP
2.1.1、添加 HicariCP 依赖库
首先在pom.xml文件中,添加 HicariCP 依赖库,内容如下:
2.1.2、编写 HicariCP 相关的配置属性
然后在application.properties文件中,自定义 HicariCP 相关的配置属性,内容如下:
2.1.3、编写 HikariDataSource 初始化方法
接着创建一个HikariDataSourceConfig,用于初始化HikariDataSource类并将其注入到 Bean 工厂中,内容如下:
最后启动服务,即可实现数据源的加载。此方案采用的是通过自定义配置文件完成连接池的手动初始化管理。
2.2、SpringBoot 整合 HicariCP(推荐)
在上文中,我们介绍了通过自定义配置文件来实现HicariCP的加载。其实也可以在 SpringBoot 的自动装配下完成HicariCP的加载。
2.2.1、添加 jdbc 依赖库
如果当前版本是Spring Boot 2.0及以上的版本,HicariCP会作为默认的数据库连接池组件。
当添加spring-boot-starter-jdbc依赖包的时候,会自动添加HicariCP相关的依赖包,无需再次重复添加。
2.2.2、添加 HicariCP 相关的配置属性
与上文不同,本次我们需要采用 Spring Boot 能识别的属性配置,以便帮助自动完成HicariCP数据源的初始化。
最后启动服务,即可实现数据源的加载。这种实现方式与上文介绍的方式效果一样,并且配置更加简单。
三、Druid
Druid 作为一个开源数据库连接池组件,因其强大的监控功能,在国内应用也非常广泛。
在此,我们也介绍两种方式来完成 Druid 连接池的配置初始化,以便于对它的使用有更清晰的理解。
- 第一种:通过自定义配置文件加载 Druid
- 第二种:SpringBoot 整合 Druid
3.1、自定义配置文件加载 Druid
3.1.1、添加 Druid 依赖库
首先在pom.xml文件中,添加 Druid 依赖库,内容如下:
3.1.2、编写 Druid 相关的配置属性
然后在application.properties文件中,自定义 Druid 相关的配置属性,内容如下:
3.1.3、编写 DruidDataSource 初始化方法
接着创建一个DruidConfig,用于初始化DruidDataSource类并将其注入到 Bean 工厂中,内容如下:
3.1.4、编写监控服务初始化方法
在上文我们有说到,Druid 自带强大的监控服务,通过相关配置类即可将其开启,内容如下:
最后启动服务,即可实现数据源的加载。
同时,在浏览器访问http://127.0.0.1:8080/druid/页面,输入在DruidMonitorConfig配置类中的账号、密码,即可登陆监控服务,查询相关 SQL 监控看板,部分界面如下:
图片
3.2、SpringBoot 整合 Druid(推荐)
如果觉得以上配置很麻烦,也可以通过 SpringBoot 的自动装配下完成Druid的加载。
3.2.1、添加 Druid-starter 依赖库
首先添加druid-spring-boot-starter依赖包,通过它来完成配置参数自动装配,内容如下:
3.2.2、添加 Druid 相关的配置属性
本次我们需要采用 Spring Boot 能识别的属性配置,以便帮助自动完成Druid数据源的初始化。
最后启动服务,即可实现数据源的加载。效果等于通过自定义配置文件实现手动加载的结果。
四、小结
本文主要围绕 Spring Boot 整合数据库连接池组件,实现系统连接数的可控管理目标进行一次知识内容的整理和总结!
五、参考
1.https://zhuanlan.zhihu.com/p/460846041
2.https://developer.aliyun.com/article/1000769