This commit is contained in:
Raod 2021-07-06 16:10:27 +08:00
parent fc3dcb5b67
commit 3058de0c5e
3 changed files with 42 additions and 20 deletions

View File

@ -93,6 +93,12 @@
<version>4.4.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
<build>
<resources>

View File

@ -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<Long, PooledDataSource> map = new HashMap<>();
static Map<Long, DruidDataSource> 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();
}

View File

@ -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;
}
}
}