From 33b93cbdb2aece8a7c6203fd2254f1ee9b6b2941 Mon Sep 17 00:00:00 2001 From: Raod <1130305001@qq.com> Date: Tue, 6 Jul 2021 16:10:27 +0800 Subject: [PATCH] druid --- report-core/pom.xml | 6 +++ .../dataSource/pool/util/JdbcUtil.java | 38 +++++++++---------- .../service/impl/DataSourceServiceImpl.java | 18 ++++++++- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/report-core/pom.xml b/report-core/pom.xml index 3e60344d..3eec9398 100644 --- a/report-core/pom.xml +++ b/report-core/pom.xml @@ -93,6 +93,12 @@ 4.4.5 + + com.alibaba + druid + 1.2.6 + + diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dataSource/pool/util/JdbcUtil.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dataSource/pool/util/JdbcUtil.java index e8a72bc0..ecaeed9f 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dataSource/pool/util/JdbcUtil.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dataSource/pool/util/JdbcUtil.java @@ -1,5 +1,6 @@ package com.anjiplus.template.gaea.business.modules.dataSource.pool.util; +import com.alibaba.druid.pool.DruidDataSource; import com.anjiplus.template.gaea.business.modules.dataSource.controller.dto.DataSourceDto; import com.anjiplus.template.gaea.business.modules.dataSource.pool.datasource.PooledDataSource; import com.anjiplus.template.gaea.business.modules.dataSource.pool.datasource.UnPooledDataSource; @@ -9,6 +10,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -18,33 +20,34 @@ import java.util.concurrent.locks.ReentrantLock; @Slf4j public class JdbcUtil { - private static Lock lock = new ReentrantLock(); - - private static Lock deleteLock = new ReentrantLock(); - //所有数据源的连接池存在map里 - static Map map = new HashMap<>(); + static Map map = new ConcurrentHashMap<>(); - public static PooledDataSource getJdbcConnectionPool(DataSourceDto dataSource) { + public static DruidDataSource getJdbcConnectionPool(DataSourceDto dataSource) { if (map.containsKey(dataSource.getId())) { return map.get(dataSource.getId()); } else { - lock.lock(); try { - log.debug(Thread.currentThread().getName() + "获取锁"); if (!map.containsKey(dataSource.getId())) { - PooledDataSource pool = new PooledDataSource(); - pool.setJdbcUrl(dataSource.getJdbcUrl()); - pool.setUser(dataSource.getUsername()); + DruidDataSource pool = new DruidDataSource(); + pool.setUrl(dataSource.getJdbcUrl()); + pool.setUsername(dataSource.getUsername()); pool.setPassword(dataSource.getPassword()); - pool.setDriverClass(dataSource.getDriverName()); - pool.init(); + pool.setDriverClassName(dataSource.getDriverName()); + + //下面都是可选的配置 + pool.setInitialSize(10); //初始连接数,默认0 + pool.setMaxActive(30); //最大连接数,默认8 + pool.setMinIdle(10); //最小闲置数 + pool.setMaxWait(2000); //获取连接的最大等待时间,单位毫秒 + pool.setPoolPreparedStatements(true); //缓存PreparedStatement,默认false + pool.setMaxOpenPreparedStatements(20); //缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句代码 + map.put(dataSource.getId(), pool); log.info("创建连接池成功:{}", dataSource.getJdbcUrl()); } return map.get(dataSource.getId()); } finally { - lock.unlock(); } } } @@ -54,18 +57,15 @@ public class JdbcUtil { * @param id */ public static void removeJdbcConnectionPool(Long id) { - deleteLock.lock(); try { - PooledDataSource pool = map.get(id); + DruidDataSource pool = map.get(id); if (pool != null) { map.remove(id); } } catch (Exception e) { log.error(e.toString()); } finally { - deleteLock.unlock(); } - } /** @@ -75,7 +75,7 @@ public class JdbcUtil { * @throws SQLException */ public static Connection getPooledConnection(DataSourceDto dataSource) throws SQLException { - PooledDataSource pool = getJdbcConnectionPool(dataSource); + DruidDataSource pool = getJdbcConnectionPool(dataSource); return pool.getConnection(); } diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dataSource/service/impl/DataSourceServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dataSource/service/impl/DataSourceServiceImpl.java index f1bd601b..a4fb8141 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dataSource/service/impl/DataSourceServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dataSource/service/impl/DataSourceServiceImpl.java @@ -3,8 +3,10 @@ package com.anjiplus.template.gaea.business.modules.dataSource.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.anji.plus.gaea.constant.BaseOperationEnum; import com.anji.plus.gaea.constant.Enabled; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; +import com.anji.plus.gaea.exception.BusinessException; import com.anji.plus.gaea.exception.BusinessExceptionBuilder; import com.anji.plus.gaea.utils.GaeaAssert; import com.anjiplus.template.gaea.business.code.ResponseCode; @@ -379,5 +381,19 @@ public class DataSourceServiceImpl implements DataSourceService { dto.setBody(body); } - + /** + * 操作后续处理 + * + * @param entity + * @param operationEnum 操作类型 + * @throws BusinessException 阻止程序继续执行或回滚事务 + */ + @Override + public void processAfterOperation(DataSource entity, BaseOperationEnum operationEnum) throws BusinessException { + switch (operationEnum){ + case DELETE: + JdbcUtil.removeJdbcConnectionPool(entity.getId()); + break; + } + } }