From cf9868720b732fd3b59c63e60c9175a51effc923 Mon Sep 17 00:00:00 2001 From: Li Zhanhui Date: Fri, 17 Nov 2023 11:42:08 +0800 Subject: [PATCH 1/2] fix: use druid datasource Signed-off-by: Li Zhanhui --- metadata-jdbc/pom.xml | 6 +-- .../metadata/HikariCPDataSourceFactory.java | 38 +++++++++++++++---- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/metadata-jdbc/pom.xml b/metadata-jdbc/pom.xml index a2d377518..9684ec497 100644 --- a/metadata-jdbc/pom.xml +++ b/metadata-jdbc/pom.xml @@ -47,9 +47,9 @@ - com.zaxxer - HikariCP - 5.0.1 + com.alibaba + druid + 1.2.20 diff --git a/metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/HikariCPDataSourceFactory.java b/metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/HikariCPDataSourceFactory.java index e43553000..85a2c580c 100644 --- a/metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/HikariCPDataSourceFactory.java +++ b/metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/HikariCPDataSourceFactory.java @@ -17,23 +17,47 @@ package com.automq.rocketmq.metadata; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; +import com.alibaba.druid.pool.DruidDataSource; +import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class HikariCPDataSourceFactory extends PooledDataSourceFactory { - private static HikariDataSource dataSource; + + private static final Logger LOGGER = LoggerFactory.getLogger(HikariCPDataSourceFactory.class); + + private static DruidDataSource dataSource; @Override public void setProperties(Properties properties) { synchronized (HikariCPDataSourceFactory.class) { if (null == dataSource) { - HikariConfig config = new HikariConfig(properties); - config.setMaximumPoolSize(20); - config.setAutoCommit(false); - dataSource = new HikariDataSource(config); + dataSource = new DruidDataSource(); + dataSource.setUrl(properties.getProperty("jdbcUrl")); + dataSource.setUsername(properties.getProperty("username")); + dataSource.setPassword(properties.getProperty("password")); + try { + dataSource.setFilters("stat,slf4j"); + } catch (SQLException e) { + LOGGER.error("Failed to set stat filter", e); + } + dataSource.setMaxActive(20); + dataSource.setInitialSize(5); + dataSource.setMinIdle(1); + dataSource.setMaxWait(6000); + + dataSource.setTimeBetweenEvictionRunsMillis(60000); + dataSource.setMinEvictableIdleTimeMillis(300000); + dataSource.setTestWhileIdle(true); + dataSource.setTestOnBorrow(true); + dataSource.setTestOnReturn(false); + + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(20); + dataSource.setAsyncInit(true); } } } From 5250322bcf3aebe136f8ce35637e141a4814cfc8 Mon Sep 17 00:00:00 2001 From: Li Zhanhui Date: Fri, 17 Nov 2023 13:38:22 +0800 Subject: [PATCH 2/2] fix: replace data source connection pool impl, from hikari to druid Signed-off-by: Li Zhanhui --- ...ctory.java => DruidDataSourceFactory.java} | 26 ++++++++++++++++--- .../resources/database/mybatis-config.xml | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) rename metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/{HikariCPDataSourceFactory.java => DruidDataSourceFactory.java} (72%) diff --git a/metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/HikariCPDataSourceFactory.java b/metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/DruidDataSourceFactory.java similarity index 72% rename from metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/HikariCPDataSourceFactory.java rename to metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/DruidDataSourceFactory.java index 85a2c580c..ea12877c8 100644 --- a/metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/HikariCPDataSourceFactory.java +++ b/metadata-jdbc/src/main/java/com/automq/rocketmq/metadata/DruidDataSourceFactory.java @@ -25,15 +25,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class HikariCPDataSourceFactory extends PooledDataSourceFactory { +public class DruidDataSourceFactory extends PooledDataSourceFactory { - private static final Logger LOGGER = LoggerFactory.getLogger(HikariCPDataSourceFactory.class); + private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceFactory.class); private static DruidDataSource dataSource; @Override public void setProperties(Properties properties) { - synchronized (HikariCPDataSourceFactory.class) { + synchronized (DruidDataSourceFactory.class) { if (null == dataSource) { dataSource = new DruidDataSource(); dataSource.setUrl(properties.getProperty("jdbcUrl")); @@ -58,6 +58,26 @@ public void setProperties(Properties properties) { dataSource.setPoolPreparedStatements(true); dataSource.setMaxOpenPreparedStatements(20); dataSource.setAsyncInit(true); + + // Slow SQL + dataSource.setConnectionProperties("druid.stat.slowSqlMillis=3000"); + + // Detect Connection Leakage + // https://github.com/alibaba/druid/wiki/%E8%BF%9E%E6%8E%A5%E6%B3%84%E6%BC%8F%E7%9B%91%E6%B5%8B + dataSource.setRemoveAbandoned(true); + // Unit: second + dataSource.setRemoveAbandonedTimeout(1800); + dataSource.setLogAbandoned(true); + + // log executable SQL + // -Ddruid.log.stmt.executableSql=true + + try { + dataSource.init(); + } catch (SQLException e) { + LOGGER.error("Failed to init druid data source", e); + throw new RuntimeException(e); + } } } } diff --git a/metadata-jdbc/src/main/resources/database/mybatis-config.xml b/metadata-jdbc/src/main/resources/database/mybatis-config.xml index 30b0e0f7e..ee8033fcc 100644 --- a/metadata-jdbc/src/main/resources/database/mybatis-config.xml +++ b/metadata-jdbc/src/main/resources/database/mybatis-config.xml @@ -57,7 +57,7 @@ - +