From 03be882ae454021b8fd53501c180763d1c52c100 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Fri, 5 May 2023 17:01:38 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4druid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- report-core/pom.xml | 5 - .../gaea/business/config/DruidProperties.java | 99 ------------------- .../business/config/HikariPoolProperties.java | 34 +++++++ .../service/impl/JdbcServiceImpl.java | 18 ++-- report-core/src/main/resources/bootstrap.yml | 24 ++--- 5 files changed, 51 insertions(+), 129 deletions(-) delete mode 100644 report-core/src/main/java/com/anjiplus/template/gaea/business/config/DruidProperties.java create mode 100644 report-core/src/main/java/com/anjiplus/template/gaea/business/config/HikariPoolProperties.java diff --git a/report-core/pom.xml b/report-core/pom.xml index 7a41ea41..7ecfd528 100644 --- a/report-core/pom.xml +++ b/report-core/pom.xml @@ -108,11 +108,6 @@ mysql-connector-java 8.0.28 - - com.alibaba - druid - 1.2.0 - org.flywaydb flyway-core diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/config/DruidProperties.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/config/DruidProperties.java deleted file mode 100644 index bed72ad5..00000000 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/config/DruidProperties.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.anjiplus.template.gaea.business.config; - -import com.alibaba.druid.pool.DruidDataSource; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * Created by raodeming on 2021/8/6. - */ -@Component -@ConfigurationProperties(prefix = "spring.druid") -@Data -public class DruidProperties { - /** - * 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 - */ - private int initialSize; - - /** - * 最小连接池数量 - */ - private int minIdle; - - /** - * 最大连接池数量 - */ - private int maxActive; - - /** - * 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 - */ - private int maxWait; - - /** - * 关闭空闲连接的检测时间间隔.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 - */ - private int timeBetweenEvictionRunsMillis; - - /** - * 连接的最小生存时间.连接保持空闲而不被驱逐的最小时间 - */ - private int minEvictableIdleTimeMillis; - - /** - * 申请连接时检测空闲时间,根据空闲时间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRun - */ - private boolean testWhileIdle; - - /** - * 开启PSCache - */ - private boolean poolPreparedStatements; - - /** - * 设置PSCache值 - */ - private int maxPoolPreparedStatementPerConnectionSize; - - /** - * 连接出错后再尝试连接三次 - */ - private int connectionErrorRetryAttempts; - - /** - * 数据库服务宕机自动重连机制 - */ - private boolean breakAfterAcquireFailure; - - /** - * 连接出错后重试时间间隔 - */ - private int timeBetweenConnectErrorMillis; - - public DruidDataSource dataSource(String url, String username, String password, String driverClassName) { - DruidDataSource datasource = new DruidDataSource(); - datasource.setUrl(url); - datasource.setUsername(username); - datasource.setPassword(password); - datasource.setDriverClassName(driverClassName); - //configuration - datasource.setInitialSize(initialSize); - datasource.setMinIdle(minIdle); - datasource.setMaxActive(maxActive); - datasource.setMaxWait(maxWait); - - datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); - datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); - datasource.setTestWhileIdle(testWhileIdle); - - datasource.setPoolPreparedStatements(poolPreparedStatements); - datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); - - datasource.setConnectionErrorRetryAttempts(connectionErrorRetryAttempts); - datasource.setBreakAfterAcquireFailure(breakAfterAcquireFailure); - datasource.setTimeBetweenConnectErrorMillis(timeBetweenConnectErrorMillis); - return datasource; - } -} diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/config/HikariPoolProperties.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/config/HikariPoolProperties.java new file mode 100644 index 00000000..91d3a5df --- /dev/null +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/config/HikariPoolProperties.java @@ -0,0 +1,34 @@ +package com.anjiplus.template.gaea.business.config; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.pool.HikariPool; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * Created by raodeming on 2021/8/6. + */ +@Component +@ConfigurationProperties(prefix = "spring.datasource.hikari") +@Data +public class HikariPoolProperties extends HikariConfig { + + + public HikariPool dataSource(String url, String username, String password, String driverClassName) { + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setJdbcUrl(url); + hikariConfig.setUsername(username); + hikariConfig.setPassword(password); + hikariConfig.setDriverClassName(driverClassName); + + hikariConfig.setConnectionTimeout(getConnectionTimeout()); + hikariConfig.setValidationTimeout(getValidationTimeout()); + hikariConfig.setIdleTimeout(getIdleTimeout()); + hikariConfig.setMaxLifetime(getMaxLifetime()); + hikariConfig.setMaximumPoolSize(getMaximumPoolSize()); + hikariConfig.setMinimumIdle(getMinimumIdle()); + HikariPool hikariPool = new HikariPool(hikariConfig); + return hikariPool; + } +} diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/datasource/service/impl/JdbcServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/datasource/service/impl/JdbcServiceImpl.java index 016bad3f..c9c7f98b 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/datasource/service/impl/JdbcServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/datasource/service/impl/JdbcServiceImpl.java @@ -1,9 +1,9 @@ package com.anjiplus.template.gaea.business.modules.datasource.service.impl; -import com.alibaba.druid.pool.DruidDataSource; -import com.anjiplus.template.gaea.business.config.DruidProperties; +import com.anjiplus.template.gaea.business.config.HikariPoolProperties; import com.anjiplus.template.gaea.business.modules.datasource.controller.dto.DataSourceDto; import com.anjiplus.template.gaea.business.modules.datasource.service.JdbcService; +import com.zaxxer.hikari.pool.HikariPool; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -21,22 +21,22 @@ import java.util.concurrent.ConcurrentHashMap; public class JdbcServiceImpl implements JdbcService { @Autowired - private DruidProperties druidProperties; + private HikariPoolProperties hikariPoolProperties; /** * 所有数据源的连接池存在map里 */ - private Map map = new ConcurrentHashMap<>(); + private Map map = new ConcurrentHashMap<>(); private Object lock = new Object(); - public DruidDataSource getJdbcConnectionPool(DataSourceDto dataSource) { + public HikariPool getJdbcConnectionPool(DataSourceDto dataSource) { if (map.containsKey(dataSource.getId())) { return map.get(dataSource.getId()); } else { try { synchronized (lock) { if (!map.containsKey(dataSource.getId())) { - DruidDataSource pool = druidProperties.dataSource(dataSource.getJdbcUrl(), + HikariPool pool = hikariPoolProperties.dataSource(dataSource.getJdbcUrl(), dataSource.getUsername(), dataSource.getPassword(), dataSource.getDriverName()); map.put(dataSource.getId(), pool); log.info("创建连接池成功:{}", dataSource.getJdbcUrl()); @@ -57,7 +57,7 @@ public class JdbcServiceImpl implements JdbcService { @Override public void removeJdbcConnectionPool(Long id) { try { - DruidDataSource pool = map.get(id); + HikariPool pool = map.get(id); if (pool != null) { log.info("remove pool success, datasourceId:{}", id); map.remove(id); @@ -77,7 +77,7 @@ public class JdbcServiceImpl implements JdbcService { */ @Override public Connection getPooledConnection(DataSourceDto dataSource) throws SQLException{ - DruidDataSource pool = getJdbcConnectionPool(dataSource); + HikariPool pool = getJdbcConnectionPool(dataSource); return pool.getConnection(); } @@ -91,7 +91,7 @@ public class JdbcServiceImpl implements JdbcService { */ @Override public Connection getUnPooledConnection(DataSourceDto dataSource) throws SQLException { - DruidDataSource druidDataSource = druidProperties.dataSource(dataSource.getJdbcUrl(), + HikariPool druidDataSource = hikariPoolProperties.dataSource(dataSource.getJdbcUrl(), dataSource.getUsername(), dataSource.getPassword(), dataSource.getDriverName()); return druidDataSource.getConnection(); } diff --git a/report-core/src/main/resources/bootstrap.yml b/report-core/src/main/resources/bootstrap.yml index 2ef5beca..25f3deaf 100644 --- a/report-core/src/main/resources/bootstrap.yml +++ b/report-core/src/main/resources/bootstrap.yml @@ -22,6 +22,14 @@ spring: url: jdbc:mysql://10.108.26.197:3306/aj_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false username: root password: appuser@anji + type: com.zaxxer.hikari.HikariDataSource + hikari: + connection-timeout: 300000 # 连接超时时间 - 默认值:30秒。 + validation-timeout: 5000 # 连接被测试活动的最长时间 - 默认值:5秒。 + idle-timeout: 60000 # 连接池中允许闲置的最长时间 - 默认值:10分钟 + max-lifetime: 1800000 # 一个连接生命时长(毫秒),超时而没被使用则被释放 - 默认值:30分钟 + maximum-pool-size: 10 #连接池中允许的最大连接数,包括闲置和使用中的连接 - 默认值:10 + minimum-idle: 5 # 连接池中允许的最小空闲连接数 - 默认值:10。 #如果要使用redis,请参考report-core目录下的README.md文件中写的进行调整 # redis: @@ -29,22 +37,6 @@ spring: # port: 6379 # password: root # database: 1 - - #数据源连接池配置 - druid: - initial-size: 10 # 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 - min-idle: 10 # 最小连接池数量 - maxActive: 200 # 最大连接池数量 - maxWait: 3000 # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 - timeBetweenEvictionRunsMillis: 60000 # 关闭空闲连接的检测时间间隔.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 - minEvictableIdleTimeMillis: 300000 # 连接的最小生存时间.连接保持空闲而不被驱逐的最小时间 - testWhileIdle: true # 申请连接时检测空闲时间,根据空闲时间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRun - poolPreparedStatements: true # 开启PSCache - maxPoolPreparedStatementPerConnectionSize: 20 #设置PSCache值 - connectionErrorRetryAttempts: 3 # 连接出错后再尝试连接三次 - breakAfterAcquireFailure: true # 数据库服务宕机自动重连机制 - timeBetweenConnectErrorMillis: 300000 # 连接出错后重试时间间隔 - validationQuery: select 1 # 用来检测连接是否有效的sql flyway: enabled: true #是否开启flyway,默认true. baseline-on-migrate: true