feat() 连接池初版V1.1

dev
chao 2024-05-10 16:33:57 +08:00
parent c23040359e
commit 064873ecc7
5 changed files with 84 additions and 32 deletions

View File

@ -5,8 +5,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
import java.lang.annotation.*;
/**
* feign
* basePackages
* feign basePackages
*
* @author Chao
*/

View File

@ -5,8 +5,8 @@ import com.etl.data.source.clinet.test.DataSourceConfig;
import com.etl.data.source.clinet.test.Singleton;
import com.etl.data.source.domain.DataSource;
import com.etl.data.source.remote.DataSourceRemoteService;
import com.etl.data.type.remote.DataTypeRemoteService;
import com.etl.data.type.domain.DataType;
import com.etl.data.type.remote.DataTypeRemoteService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
@ -14,9 +14,13 @@ import org.springframework.boot.ApplicationRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
*
*
*
* @author Chao
* @ClassName: DataSourceClientRunner
@ -32,26 +36,50 @@ public class DataSourceClientRunner implements ApplicationRunner {
private DataTypeRemoteService dataTypeRemoteService;
@Override
public void run(ApplicationArguments args) throws Exception {
public void run(ApplicationArguments args){
try {
Result<List<DataSource>> dataSourceResultList = dataSourceRemoteService.dataSourceList();
if (dataSourceResultList.getData() == null || dataSourceResultList.getData().isEmpty()){
log.error("数据源列表为空");
return;
}
List<DataSource> dataSourceList = dataSourceResultList.getData();
// 创建数据源Map
HashMap<String, javax.sql.DataSource> stringDataSourceHashMap = new HashMap<>();
log.info("数据源列表查询成功当前数据为{}" ,dataSourceList);
// 获取数据源类型列表
Result<List<DataType>> dataTypeResultList = dataTypeRemoteService.list();
if (dataTypeResultList.getData() == null || dataTypeResultList.getData().isEmpty()){
log.error("数据源类型列表为空");
return;
}
List<DataType> dataTypeList = dataTypeResultList.getData();
log.info("数据源类型列表查询成功当前数据为{}" ,dataTypeList);
// 将数据源类型转换为Map ## Function.identity() 这个方法是返回一个自己
Map<Long, DataType> dataTypeMap = dataTypeList.stream()
.collect(
Collectors.toMap(
DataType::getId, Function.identity()
)
);
// 创建数据源Map
HashMap<String, javax.sql.DataSource> stringDataSourceHashMap = new HashMap<>();
// 遍历数据源列表
for (DataSource datum : dataSourceList){
// 过滤相应的数据源类型
DataType type = dataTypeList.stream()
.filter(
dataType -> dataType.getId().equals(datum.getTypeId())
).findFirst()
.get();
javax.sql.DataSource dataSource = DataSourceConfig.dataSource(datum,type);
Optional<DataType> dataType = Optional.ofNullable(dataTypeMap.get(datum.getTypeId()));
if (dataType.isPresent()){
javax.sql.DataSource dataSource = DataSourceConfig.dataSource(datum, dataType.get());
stringDataSourceHashMap.put(datum.getDataSourceIp()+"-"+datum.getDataSourceDatabaseName(),dataSource);
}else {
log.error("未找到数据源 ID 为 {} 的数据类型", datum.getTypeId());
}
Singleton instance = Singleton.getInstance(stringDataSourceHashMap);
Map<String, javax.sql.DataSource> map = instance.getMap();
log.info("数据源连接池初始化成功{}",map);
}
} catch (Exception e) {
log.error("初始化数据源连接池失败{}",e.getMessage());
throw new RuntimeException(e);
}
Singleton.getInstance(stringDataSourceHashMap);
}
}

View File

@ -6,23 +6,42 @@ import lombok.Data;
import javax.sql.DataSource;
import java.util.Map;
/**
*
*
* @author Han
*/
@Data
@AllArgsConstructor
public class Singleton {
private Map<String , DataSource> map ;
//使用volatile修饰变量具有原子性、可见性和防止指令重排的特性。
private volatile Map<String, DataSource> map;
private volatile static Singleton singleton;
private static Singleton singleton;
/**
* 线
* 使使volatile
*
* @param map
* @return
* @param map map
* @return Singleton
*/
public static synchronized Singleton getInstance(Map<String ,DataSource> map) {
public static Singleton getInstance(Map<String, DataSource> map) {
//先进行实例判断,只有当不存在的时候才去创建实例。
if (singleton == null) {
//用synchronized 同步代码块
//注意此处不能用this因为this不能和static同用。
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton(map);
}
}
}
return singleton;
}
/**
* 使,
*/
private Singleton () {}
}

View File

@ -1,9 +1,12 @@
package com.etl.data.source.remote.factory;
import com.etl.common.core.domain.Result;
import com.etl.data.source.domain.DataSource;
import com.etl.data.source.remote.DataSourceRemoteService;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.ArrayList;
/**
*
*
@ -15,6 +18,6 @@ public class DataSourceFactory implements FallbackFactory<DataSourceRemoteServic
@Override
public DataSourceRemoteService create(Throwable cause) {
return Result::error;
return () -> Result.success(new ArrayList<DataSource>());
}
}

View File

@ -1,9 +1,12 @@
package com.etl.data.type.remote.factory;
import com.etl.common.core.domain.Result;
import com.etl.data.type.domain.DataType;
import com.etl.data.type.remote.DataTypeRemoteService;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.ArrayList;
/**
*
*
@ -15,6 +18,6 @@ public class DataTypeFactory implements FallbackFactory<DataTypeRemoteService> {
@Override
public DataTypeRemoteService create(Throwable cause) {
return Result::error;
return () -> Result.error(new ArrayList<DataType>());
}
}