甘肃酒泉建设银行网站,加强企业网站建设作用,做信息网站能挣钱吗,中国企业资讯网在项目中#xff0c;数据库连接池基本是必不可少的组件。在目前数据库连接池的选型中#xff0c;主要是
Druid #xff0c;为监控而生的数据库连接池。HikariCP #xff0c;号称性能最好的数据库连接池。
在Spring Boot 2.X 版本#xff0c;默认采用 HikariCP 连接池。而…在项目中数据库连接池基本是必不可少的组件。在目前数据库连接池的选型中主要是
Druid 为监控而生的数据库连接池。HikariCP 号称性能最好的数据库连接池。
在Spring Boot 2.X 版本默认采用 HikariCP 连接池。而阿里大规模采用 Druid 。下面介绍在SpringBoot中使用HikariCP、Druid连接池。
1、HikariCP数据库连接池
1.1 HikariCP单数据源配置
1.1.1 pom文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.1.3.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentmodelVersion4.0.0/modelVersionartifactIdHikariCP-Boot/artifactIddependencies!-- 实现对数据库连接池的自动化配置 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.48/version/dependency!-- 写单元测试 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies/project无需主动引入 HikariCP 的依赖。因为在 Spring Boot 2.X 中spring-boot-starter-jdbc 默认引入 com.zaxxer.HikariCP 依赖。
1.1.2 yml配置
server:port: 7890spring:# datasource 数据源配置内容对应 DataSourceProperties 配置属性类datasource:url: jdbc:mysql://127.0.0.1:3306/test?useSSLfalseuseUnicodetruecharacterEncodingUTF-8driver-class-name: com.mysql.jdbc.Driverusername: root # 数据库账号password: root # 数据库密码# HikariCP 自定义配置对应 HikariConfig 配置属性类hikari:minimum-idle: 10 # 池中维护的最小空闲连接数默认为 10 个。maximum-pool-size: 10 # 池中最大连接数包括闲置和使用中的连接默认为 10 个。在 spring.datasource 配置项下我们可以添加数据源的通用配置。在 spring.datasource.hikari 配置项下我们可以添加 HikariCP 连接池的自定义配置。然后 DataSourceConfiguration.Hikari会自动化配置 HikariCP 连接池。
1.1.3 主启动类
package com.yyds;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;SpringBootApplication
public class ApplicationBak implements CommandLineRunner {private Logger logger LoggerFactory.getLogger(ApplicationBak.class);Autowiredprivate DataSource dataSource;public static void main(String[] args) {// 启动 Spring Boot 应用SpringApplication.run(ApplicationBak.class, args);}Overridepublic void run(String... args) {try (Connection conn dataSource.getConnection()) {// 这里可以做点什么logger.info([run][获得连接{}], conn);} catch (SQLException e) {throw new RuntimeException(e);}}}通过实现 CommandLineRunner接口应用启动完成后回调 #run(String... args) 方法输出 Connection 信息。
1.2 HikariCP多数据源配置
1.2.1 pom文件
如1.2.1所示。
1.2.2 yml配置
spring:# datasource 数据源配置内容datasource:# 订单数据源配置orders:url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSLfalseuseUnicodetruecharacterEncodingUTF-8driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: root# HikariCP 自定义配置对应 HikariConfig 配置属性类hikari:minimum-idle: 20 # 池中维护的最小空闲连接数默认为 10 个。maximum-pool-size: 20 # 池中最大连接数包括闲置和使用中的连接默认为 10 个。# 用户数据源配置users:url: jdbc:mysql://127.0.0.1:3306/test_users?useSSLfalseuseUnicodetruecharacterEncodingUTF-8driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: root# HikariCP 自定义配置对应 HikariConfig 配置属性类hikari:minimum-idle: 15 # 池中维护的最小空闲连接数默认为 10 个。maximum-pool-size: 15 # 池中最大连接数包括闲置和使用中的连接默认为 10 个。1.2.3 主启动类
package com.yyds;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.annotation.Resource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;SpringBootApplication
public class Application implements CommandLineRunner {private Logger logger LoggerFactory.getLogger(Application.class);Resource(name ordersDataSource)private DataSource ordersDataSource;Resource(name usersDataSource)private DataSource usersDataSource;public static void main(String[] args) {// 启动 Spring Boot 应用SpringApplication.run(Application.class, args);}Overridepublic void run(String... args) {// orders 数据源try (Connection conn ordersDataSource.getConnection()) {// 这里可以做点什么logger.info([run][ordersDataSource 获得连接{}], conn);} catch (SQLException e) {throw new RuntimeException(e);}// users 数据源try (Connection conn usersDataSource.getConnection()) {// 这里可以做点什么logger.info([run][usersDataSource 获得连接{}], conn);} catch (SQLException e) {throw new RuntimeException(e);}}}
1.2.4 配置类
package com.yyds.config;import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.util.StringUtils;import javax.sql.DataSource;Configuration
public class DataSourceConfig {/*** 创建 orders 数据源的配置对象*/PrimaryBean(name ordersDataSourceProperties)ConfigurationProperties(prefix spring.datasource.orders) // 读取 spring.datasource.orders 配置到 DataSourceProperties 对象public DataSourceProperties ordersDataSourceProperties() {return new DataSourceProperties();}/*** 创建 orders 数据源*/Bean(name ordersDataSource)ConfigurationProperties(prefix spring.datasource.orders.hikari) // 读取 spring.datasource.orders 配置到 HikariDataSource 对象public DataSource ordersDataSource() {// 1.1 获得 DataSourceProperties 对象DataSourceProperties properties this.ordersDataSourceProperties();// 1.2 创建 HikariDataSource 对象return createHikariDataSource(properties);}/*** 创建 users 数据源的配置对象*/Bean(name usersDataSourceProperties)ConfigurationProperties(prefix spring.datasource.users) // 读取 spring.datasource.users 配置到 DataSourceProperties 对象public DataSourceProperties usersDataSourceProperties() {return new DataSourceProperties();}/*** 创建 users 数据源*/Bean(name usersDataSource)ConfigurationProperties(prefix spring.datasource.users.hikari)public DataSource usersDataSource() {// 获得 DataSourceProperties 对象DataSourceProperties properties this.usersDataSourceProperties();// 创建 HikariDataSource 对象return createHikariDataSource(properties);}private static HikariDataSource createHikariDataSource(DataSourceProperties properties) {// 创建 HikariDataSource 对象HikariDataSource dataSource properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();// 设置线程池名if (StringUtils.hasText(properties.getName())) {dataSource.setPoolName(properties.getName());}return dataSource;}}ordersDataSourceProperties()方法创建orders数据源的DataSourceProperties配置对象。 Primary注解保证项目中有一个主的DataSourceProperties Bean。 加上 Bean(name “ordersDataSourceProperties”)注解会创建一个名字位ordersDataSourceProperties的DataSourceProperties Bean ConfigurationProperties(prefix “spring.datasource.orders”)注解会将spring.datasource.orders配置项逐个属性赋值给DataSourceProperties Bean
ordersDataSource()方法创建orders数据源。 DataSourceProperties properties this.ordersDataSourceProperties();获取orders数据源的DataSourceProperties配置对象 createHikariDataSource()方法创建HikariDataSource对象这样spring.datasource.orders 配置项逐个属性赋值给 HikariDataSource Bean 。 搭配上 Bean(name ordersDataSource) 注解会创建一个名字为 ordersDataSource 的 HikariDataSource Bean 。 ConfigurationProperties(prefix spring.datasource.orders.hikari) 注解会将 HikariCP 的 spring.datasource.orders.hikari 自定义配置项逐个属性赋值给 HikariDataSource Bean 。 2、Druid数据库连接池
2.1 Druid单数据源配置
2.1.1 pom文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.1.3.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentmodelVersion4.0.0/modelVersionartifactIdDruid-Boot/artifactIddependencies!-- 保证 Spring JDBC 的依赖健全 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependency!-- 实现对 Druid 连接池的自动化配置 --dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.21/version/dependencydependency groupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.48/version/dependency!-- 实现对 Spring MVC 的自动化配置因为我们需要看看 Druid 的监控功能 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- 方便等会写单元测试 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies/project2.1.2 yml配置
spring:# datasource 数据源配置内容对应 DataSourceProperties 配置属性类datasource:url: jdbc:mysql://127.0.0.1:3306/test?useSSLfalseuseUnicodetruecharacterEncodingUTF-8driver-class-name: com.mysql.jdbc.Driverusername: root # 数据库账号password: root # 数据库密码type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource# Druid 自定义配置对应 DruidDataSource 中的 setting 方法的属性druid:min-idle: 0 # 池中维护的最小空闲连接数默认为 0 个。max-active: 20 # 池中最大连接数包括闲置和使用中的连接默认为 8 个。filter:stat: # 配置 StatFilter 对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilterlog-slow-sql: true # 开启慢查询记录slow-sql-millis: 5000 # 慢 SQL 的标准单位毫秒stat-view-servlet: # 配置 StatViewServlet 对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AEenabled: true # 是否开启 StatViewServletlogin-username: root # 账号login-password: root # 密码2.1.3主启动类
package com.yyds;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.sql.DataSource;SpringBootApplication
public class ApplicationBak implements CommandLineRunner {private Logger logger LoggerFactory.getLogger(ApplicationBak.class);Autowiredprivate DataSource dataSource;public static void main(String[] args) {// 启动 Spring Boot 应用SpringApplication.run(ApplicationBak.class, args);}Overridepublic void run(String... args) {logger.info([run][获得数据源{}], dataSource.getClass());}}
2.1.4 监控
因为做了如下操作
通过 spring.datasource.filter.stat 配置了 StatFilter 统计监控信息。通过 spring.datasource.filter.stat-view-servlet 配置了 StatViewServlet 提供监控信息的展示的 html 页面和 JSON API
所以我们在启动项目后访问 http://127.0.0.1:8080/druid 地址账户密码为配置的root可以看到监控 html 页面。 在界面的顶部提供了数据源、SQL 监控、SQL 防火墙等功能。每个界面上可以通过 [View JSON API]获得数据的来源。因为监控信息是存储在 JVM 内存中在 JVM 进程重启时信息将会丢失。如果我们希望持久化到 MySQL、Elasticsearch、HBase 等存储器中可以通过 StatViewServlet 提供的 JSON API 接口采集监控信息。
Druid 的文档https://github.com/alibaba/druid/wiki/ 。
2.2 Druid多数据源配置
2.2.1 pom文件
如2.1.1
2.2.2 yml配置
spring:# datasource 数据源配置内容datasource:# 订单数据源配置orders:url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSLfalseuseUnicodetruecharacterEncodingUTF-8driver-class-name: com.mysql.jdbc.Driverusername: rootpassword:type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource# Druid 自定义配置对应 DruidDataSource 中的 setting 方法的属性min-idle: 0 # 池中维护的最小空闲连接数默认为 0 个。max-active: 20 # 池中最大连接数包括闲置和使用中的连接默认为 8 个。# 用户数据源配置users:url: jdbc:mysql://127.0.0.1:3306/test_users?useSSLfalseuseUnicodetruecharacterEncodingUTF-8driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: roottype: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource# Druid 自定义配置对应 DruidDataSource 中的 setting 方法的属性min-idle: 0 # 池中维护的最小空闲连接数默认为 0 个。max-active: 20 # 池中最大连接数包括闲置和使用中的连接默认为 8 个。# Druid 自定已配置druid:# 过滤器配置filter:stat: # 配置 StatFilter 对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilterlog-slow-sql: true # 开启慢查询记录slow-sql-millis: 5000 # 慢 SQL 的标准单位毫秒# StatViewServlet 配置stat-view-servlet: # 配置 StatViewServlet 对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AEenabled: true # 是否开启 StatViewServletlogin-username: root # 账号login-password: root # 密码2.2.3主启动类
package com.yyds;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.annotation.Resource;
import javax.sql.DataSource;SpringBootApplication
public class Application implements CommandLineRunner {private Logger logger LoggerFactory.getLogger(Application.class);Resource(name ordersDataSource)private DataSource ordersDataSource;Resource(name usersDataSource)private DataSource usersDataSource;public static void main(String[] args) {// 启动 Spring Boot 应用SpringApplication.run(Application.class, args);}Overridepublic void run(String... args) {// orders 数据源logger.info([run][获得数据源{}], ordersDataSource.getClass());// users 数据源logger.info([run][获得数据源{}], usersDataSource.getClass());}}
2.2.4 配置类
package com.yyds.config;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import javax.sql.DataSource;Configuration
public class DataSourceConfig {/*** 创建 orders 数据源*/PrimaryBean(name ordersDataSource)ConfigurationProperties(prefix spring.datasource.orders) public DataSource ordersDataSource() {return DruidDataSourceBuilder.create().build();}/*** 创建 users 数据源*/Bean(name usersDataSource)ConfigurationProperties(prefix spring.datasource.users)public DataSource usersDataSource() {return DruidDataSourceBuilder.create().build();}}
可以看到数据源加载成功。