From a48cd106b6162e580cdef8f47e01454008207fba Mon Sep 17 00:00:00 2001
From: Yunfei Du <278774021@qq.com>
Date: Wed, 15 May 2024 18:29:54 +0800
Subject: [PATCH] =?UTF-8?q?feat:=E8=A7=84=E5=88=99=E5=BC=95=E6=93=8E(?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E5=88=9D=E5=A7=8B=E5=8C=96)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
etl-common/etl-common-core/pom.xml | 5 +
etl-common/etl-common-data-standard/pom.xml | 27 +++++
.../conmon/data/standard/model/DataModel.java | 44 +++++++
.../data/standard/model/DataSetModel.java | 38 ++++++
.../data/standard/model/DataStandard.java | 10 ++
.../data/standard/model/RecordModel.java | 78 ++++++++++++
.../conmon/data/standard/utils/EtlUtils.java | 21 ++++
etl-common/pom.xml | 1 +
.../client/config/DataAccessClientRunner.java | 34 +++---
.../client/connPool/pool/ConnPoolContext.java | 53 ++++++++
.../service/ConnPoolManagementService.java | 114 ++++++++++++++++++
.../java/com/etl/data/domain/DataSource.java | 5 +
.../data/controller/DataSourceController.java | 6 +-
.../service/impl/DataSourceServiceImpl.java | 3 +
14 files changed, 421 insertions(+), 18 deletions(-)
create mode 100644 etl-common/etl-common-data-standard/pom.xml
create mode 100644 etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataModel.java
create mode 100644 etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataSetModel.java
create mode 100644 etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataStandard.java
create mode 100644 etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/RecordModel.java
create mode 100644 etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/utils/EtlUtils.java
create mode 100644 etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/connPool/pool/ConnPoolContext.java
create mode 100644 etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/connPool/service/ConnPoolManagementService.java
diff --git a/etl-common/etl-common-core/pom.xml b/etl-common/etl-common-core/pom.xml
index f641aa9..d683dc7 100644
--- a/etl-common/etl-common-core/pom.xml
+++ b/etl-common/etl-common-core/pom.xml
@@ -141,6 +141,11 @@
jedis
+
+ org.projectlombok
+ lombok
+
+
diff --git a/etl-common/etl-common-data-standard/pom.xml b/etl-common/etl-common-data-standard/pom.xml
new file mode 100644
index 0000000..fb1cad3
--- /dev/null
+++ b/etl-common/etl-common-data-standard/pom.xml
@@ -0,0 +1,27 @@
+
+
+ 4.0.0
+
+ com.etl
+ etl-common
+ 3.6.3
+
+
+ etl-common-data-standard
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ com.etl
+ etl-common-core
+
+
+
+
diff --git a/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataModel.java b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataModel.java
new file mode 100644
index 0000000..9b8bb7a
--- /dev/null
+++ b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataModel.java
@@ -0,0 +1,44 @@
+package com.etl.conmon.data.standard.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 数据模型
+ * @author YunFei.Du
+ * @date 14:16 2024/5/15
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DataModel {
+
+ /**
+ * 数据键
+ */
+ private String key;
+
+ /**
+ * 数据值
+ */
+ private Object value;
+
+ /**
+ * 源标准-枚举
+ */
+ private String sourceType;
+
+ /**
+ * 处理标准-枚举
+ */
+ private String processType;
+
+ /**
+ * 处理类型
+ */
+ private Class> processClass;
+
+}
diff --git a/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataSetModel.java b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataSetModel.java
new file mode 100644
index 0000000..2538611
--- /dev/null
+++ b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataSetModel.java
@@ -0,0 +1,38 @@
+package com.etl.conmon.data.standard.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 一页
+ * @author YunFei.Du
+ * @date 14:17 2024/5/15
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DataSetModel {
+
+ // [[DataModel,DataModel,DataModel],[DataModel,DataModel,DataModel]]
+
+ private DataSetModel[] dataSetModel = null;
+
+ private int setLength;
+
+
+ public static DataSetModel build(int dataSetModelLength){
+ return build ( new DataSetModel[dataSetModelLength] );
+ }
+
+ public static DataSetModel build(DataSetModel[] dataSetModel){
+ return DataSetModel.builder ()
+ .dataSetModel(dataSetModel)
+ .setLength ( dataSetModel.length )
+ .build ();
+ }
+
+
+}
diff --git a/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataStandard.java b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataStandard.java
new file mode 100644
index 0000000..9a32882
--- /dev/null
+++ b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/DataStandard.java
@@ -0,0 +1,10 @@
+package com.etl.conmon.data.standard.model;
+
+/**
+ * 数据标准
+ * @author YunFei.Du
+ * @date 14:17 2024/5/15
+ */
+public interface DataStandard {
+
+}
diff --git a/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/RecordModel.java b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/RecordModel.java
new file mode 100644
index 0000000..d216a9a
--- /dev/null
+++ b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/model/RecordModel.java
@@ -0,0 +1,78 @@
+package com.etl.conmon.data.standard.model;
+
+import com.etl.conmon.data.standard.utils.EtlUtils;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Arrays;
+import java.util.function.IntFunction;
+
+/**
+ * 记录模型
+ * @author YunFei.Du
+ * @date 14:17 2024/5/15
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RecordModel {
+ // [DataModel,DataModel,DataModel]
+
+ /**
+ * 指定key主键 ([] 比 集合 高级)
+ */
+ private String[] keys;
+
+ /**
+ * 主键数据
+ */
+ private DataModel[] keyForValue;
+ /**
+ * 单条记录 由 多个模型组成
+ */
+ private DataModel[] dataModelArr = null;
+
+ /**
+ * 记录长度
+ */
+ private int recodeLength;
+
+ /**
+ * 构建一个RecordModel实例。
+ * 该方法是build(int dataModelLength, String[] keys)的重载版本,提供了一个便捷的方式来创建RecordModel实例,
+ * 其中数据模型数组的长度由dataModelLength指定,键数组由keys指定。
+ *
+ * @param dataModelLength 数据模型数组的长度。表示RecordModel中数据模型的数量。
+ * @param keys 与数据模型相关联的键数组。这些键用于在RecordModel中标识和访问数据模型。
+ * @return 返回一个构建好的RecordModel实例,其中包含指定数量的数据模型,并且每个数据模型都与一个键相关联。
+ */
+ public static RecordModel build(int dataModelLength,String[] keys){
+ // 使用提供的数据模型长度和键数组来构建RecordModel
+ return build ( new DataModel[dataModelLength] , keys);
+ }
+
+ /**
+ * 根据给定的数据模型数组和键数组构建一个记录模型。
+ *
+ * @param dataModelArr 数据模型数组,包含了一系列的数据模型实例。
+ * @param keys 键数组,用于在数据模型中筛选特定的记录。
+ * @return 返回一个构建好的记录模型实例,该实例包含了指定的数据显示和键值对应关系。
+ */
+ public static RecordModel build(DataModel[] dataModelArr, String[] keys){
+ return RecordModel.builder()
+ .dataModelArr ( dataModelArr )
+ .recodeLength ( dataModelArr.length )
+ .keys( keys)
+ // 筛选数据模型数组中键值匹配给定键数组的元素,并将其设置为keyForValue
+ .keyForValue(
+ Arrays.stream (dataModelArr).filter ( dataModel -> EtlUtils.valAsArr ( keys , dataModel.getKey () ) )
+ .toArray ( value -> new DataModel[0] )
+ )
+ .build ();
+ }
+
+
+}
diff --git a/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/utils/EtlUtils.java b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/utils/EtlUtils.java
new file mode 100644
index 0000000..572b142
--- /dev/null
+++ b/etl-common/etl-common-data-standard/src/main/java/com/etl/conmon/data/standard/utils/EtlUtils.java
@@ -0,0 +1,21 @@
+package com.etl.conmon.data.standard.utils;
+
+/**
+ * @ClassName EtlUtils
+ * @Description 描述
+ * @Author YunFei.Du
+ * @Date 2024/5/15 14:28
+ */
+
+public class EtlUtils {
+
+ public static boolean valAsArr(String[] keys,String key ){
+ for (String s : keys) {
+ if (s.equals ( key )){
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/etl-common/pom.xml b/etl-common/pom.xml
index 1b41198..c83aa9b 100644
--- a/etl-common/pom.xml
+++ b/etl-common/pom.xml
@@ -18,6 +18,7 @@
etl-common-datascope
etl-common-datasource
etl-common-system
+ etl-common-data-standard
etl-common
diff --git a/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/config/DataAccessClientRunner.java b/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/config/DataAccessClientRunner.java
index 73a9b65..0cb5a06 100644
--- a/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/config/DataAccessClientRunner.java
+++ b/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/config/DataAccessClientRunner.java
@@ -1,6 +1,8 @@
package com.etl.data.client.config;
+import com.alibaba.druid.pool.DruidPooledConnection;
+import com.etl.data.client.connPool.service.ConnPoolManagementService;
import com.etl.data.client.jdbcUtils.JDBCConcreteClass;
import com.etl.data.domain.DataSource;
import com.etl.data.domain.dataSource.DataSourceConfig;
@@ -15,6 +17,7 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.util.List;
+import java.util.Map;
/**
* 数据访问客户端运行程序
@@ -32,25 +35,26 @@ public class DataAccessClientRunner implements ApplicationRunner {
public void run(ApplicationArguments args) {
List< DataSource > dataSourceList = remoteDataSourceService.getDataSourceList ( new DataSourceQueryReq ( ) ).getData ( ).getRows ( );
+ if (!dataSourceList.isEmpty ()){
+ ConnPoolManagementService.init ( dataSourceList );
+
try {
- dataSourceList.stream ( ).forEach ( dataSource -> {
- log.info ( "dataSource:{}", dataSource );
- DataSourceConfig.init ( dataSource );
- } );
- String key = dataSourceList.get ( 0 ).getName ( ) + dataSourceList.get ( 0 ).getId ( );
- DataSourceConfig.getNum ( key );
- Connection connection = DataSourceConfig.getConnection ( key );
- JDBCConcreteClass jdbcConcreteClass = new JDBCConcreteClass ( );
- PreparedStatement preparedStatement = jdbcConcreteClass.getPreparedStatement ( connection, "select * from car" );
- ResultSetMetaData rsd = preparedStatement.getMetaData ( );
- for (int i = 1; i <= rsd.getColumnCount ( ); i++) {
- log.info ( "类型:{}", rsd.getColumnClassName ( i ) );
- }
- DataSourceConfig.close ( connection );
- DataSourceConfig.getNum ( key );
+ DruidPooledConnection druidPooledConnection = ConnPoolManagementService.get ( dataSourceList.get ( 0 ).getKey ( ) );
+
+// Map< DruidPooledConnection, String > connToKey = ConnPoolManagementService.getConnToKey ( );
+ log.info ( "connToKey:{}", druidPooledConnection );
+
+// JDBCConcreteClass jdbcConcreteClass = new JDBCConcreteClass ( );
+// PreparedStatement preparedStatement = jdbcConcreteClass.getPreparedStatement ( connection, "select * from car" );
+// ResultSetMetaData rsd = preparedStatement.getMetaData ( );
+// for (int i = 1; i <= rsd.getColumnCount ( ); i++) {
+// log.info ( "类型:{}", rsd.getColumnClassName ( i ) );
+// }
+ ConnPoolManagementService.returnConnection ( druidPooledConnection );
} catch (Exception e) {
log.error ( "数据访问客户端运行程序异常:{}", e.getMessage ( ) );
throw new RuntimeException ( e );
}
}
+ }
}
diff --git a/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/connPool/pool/ConnPoolContext.java b/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/connPool/pool/ConnPoolContext.java
new file mode 100644
index 0000000..8dad205
--- /dev/null
+++ b/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/connPool/pool/ConnPoolContext.java
@@ -0,0 +1,53 @@
+package com.etl.data.client.connPool.pool;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.etl.common.core.exception.ServiceException;
+import com.etl.common.core.utils.StringUtils;
+import com.etl.common.security.utils.SecurityUtils;
+import lombok.extern.log4j.Log4j2;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 连接池上下文
+ * @author YunFei.Du
+ * @date 15:04 2024/5/15
+ */
+@Log4j2
+public class ConnPoolContext {
+
+ /**
+ * 无参 其他不能构造
+ */
+ private ConnPoolContext(){
+
+ }
+ private final static ConcurrentHashMap connPoolContext
+ = new ConcurrentHashMap<>(16);
+
+ public static void setConnection(String key,DruidDataSource druidDataSource){
+ if (connPoolContext.containsKey(key)){
+ throw new ServiceException (
+ StringUtils.format ( "连接池key:{} 已存在" )
+ );
+ }
+ connPoolContext.put(key,druidDataSource);
+ }
+
+ /**
+ * 通过key获取连接池
+ * @param key
+ * @return
+ */
+ public static DruidDataSource getConnection(String key){
+ return connPoolContext.get ( key );
+ }
+
+ public static void remove(String key){
+ try (DruidDataSource druidDataSource = connPoolContext.remove ( key )) {
+ druidDataSource.close ();
+ }catch (RuntimeException e){
+ log.warn ( "关闭连接池失败:[{}]-- [{}]", key,e.getMessage (),e );
+ }
+ }
+}
diff --git a/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/connPool/service/ConnPoolManagementService.java b/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/connPool/service/ConnPoolManagementService.java
new file mode 100644
index 0000000..0d8869f
--- /dev/null
+++ b/etl-modules/etl-data-source/etl-data-source-client/src/main/java/com/etl/data/client/connPool/service/ConnPoolManagementService.java
@@ -0,0 +1,114 @@
+package com.etl.data.client.connPool.service;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidPooledConnection;
+import com.etl.data.client.connPool.pool.ConnPoolContext;
+import com.etl.data.domain.DataSource;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.stereotype.Component;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Map;
+
+import static com.etl.data.client.connPool.pool.ConnPoolContext.getConnection;
+
+
+/**
+ * @ClassName ConnPollManagementService
+ * @Description 描述
+ * @Author YunFei.Du
+ * @Date 2024/5/15 15:14
+ */
+@Component
+@Log4j2
+public class ConnPoolManagementService {
+
+ private final static ThreadLocal< Map > connToKey
+ = new ThreadLocal<> ( );
+
+ public static Map getConnToKey() {
+ Map dataMap=connToKey.get ();
+
+ return dataMap;
+ }
+
+ /**
+ * 初始化
+ */
+ public static void init(List< DataSource> dataSourceList) {
+ for (DataSource dataSource : dataSourceList) {
+ createPool ( dataSource );
+ }
+
+ }
+
+ /**
+ * 新增
+ */
+ public static void createPool(DataSource dataSource){
+ DruidDataSource druidDataSource = new DruidDataSource ( );
+ druidDataSource.setUsername ( dataSource.getUsername ( ) );
+ druidDataSource.setPassword ( dataSource.getPassword ( ) );
+ druidDataSource.setUrl ( "jdbc:mysql://" + dataSource.getHost ( ) + ":" + dataSource.getPort ( ) + "/" + dataSource.getDatabaseName ( ) );
+ druidDataSource.setDriverClassName ( dataSource.getJdbcDriver ( ) );
+ // 设置初始化连接数和最小空闲连接数
+ druidDataSource.setInitialSize ( Integer.valueOf ( dataSource.getInitNum ( ) ) );
+ druidDataSource.setMinIdle ( Integer.valueOf ( dataSource.getInitNum ( ) ) );
+ // 设置最大活动连接数
+ druidDataSource.setMaxActive ( Integer.valueOf ( dataSource.getMaxNum ( ) ) );
+
+ ConnPoolContext.setConnection ( dataSource.getKey (), druidDataSource );
+ try {
+ druidDataSource.init ();
+ } catch (SQLException e) {
+ log.error ( "新增数据源失败" );
+ throw new RuntimeException ( e );
+ }
+ ;
+
+ }
+
+ /**
+ * 获取
+ */
+ public static DruidPooledConnection get(DataSource dataSource){
+ return get ( dataSource.getKey () );
+ }
+
+ /**
+ * 获取
+ */
+ public static DruidPooledConnection get(String key){
+ DruidPooledConnection connection=null;
+ DruidDataSource druidDataSource = getConnection (key );
+ try {
+ connection = druidDataSource.getConnection ( );
+ return connection;
+ } catch (SQLException e) {
+ log.warn ( "获取连接异常:[{}] - [{}]",e.getMessage (),e );
+ throw new RuntimeException ( e );
+ }finally {
+ getConnToKey ().put ( connection,key );
+ }
+ }
+
+ /**
+ * 释放
+ * @param connection
+ */
+ public static void returnConnection(DruidPooledConnection connection) {
+ try {
+ connection.close ();
+ } catch (SQLException e) {
+ log.warn ( "获取连接异常:[{}] - [{}]",getConnToKey().get ( connection ),e.getMessage () );
+ throw new RuntimeException ( e );
+ }finally {
+ getConnToKey ().remove ( connection );
+ }
+ }
+
+
+ public static void remove(DataSource dataSource) {
+
+ }
+}
diff --git a/etl-modules/etl-data-source/etl-data-source-common/src/main/java/com/etl/data/domain/DataSource.java b/etl-modules/etl-data-source/etl-data-source-common/src/main/java/com/etl/data/domain/DataSource.java
index cbe3f51..d1ecca9 100644
--- a/etl-modules/etl-data-source/etl-data-source-common/src/main/java/com/etl/data/domain/DataSource.java
+++ b/etl-modules/etl-data-source/etl-data-source-common/src/main/java/com/etl/data/domain/DataSource.java
@@ -95,4 +95,9 @@ public class DataSource extends BaseEntity {
* 模式名称
*/
private String modeName;
+
+
+ public String getKey(){
+ return this.name+"_"+this.systemName+"_"+this.id;
+ }
}
diff --git a/etl-modules/etl-data-source/etl-data-source-server/src/main/java/com/etl/data/controller/DataSourceController.java b/etl-modules/etl-data-source/etl-data-source-server/src/main/java/com/etl/data/controller/DataSourceController.java
index 147e594..128075f 100644
--- a/etl-modules/etl-data-source/etl-data-source-server/src/main/java/com/etl/data/controller/DataSourceController.java
+++ b/etl-modules/etl-data-source/etl-data-source-server/src/main/java/com/etl/data/controller/DataSourceController.java
@@ -25,15 +25,15 @@ public class DataSourceController extends BaseController {
@Autowired
private DataSourceService dataSourceService;
+ public static ThreadLocal< String > local = new ThreadLocal<> ( );
/**
* 查询数据源列表
*/
@PostMapping("/list")
public Result< TableDataInfo > getDataSourceList (@RequestBody DataSourceQueryReq req) {
startPage();
- ThreadLocal< String > local = new ThreadLocal<> ( );
- String s = local.get ( );
- System.out.println ("asd"+s );
+
+ local.set ( "asdf" );
List list = dataSourceService.selectDataSourceList(req);
return getDataAsset (list);
}
diff --git a/etl-modules/etl-data-source/etl-data-source-server/src/main/java/com/etl/data/service/impl/DataSourceServiceImpl.java b/etl-modules/etl-data-source/etl-data-source-server/src/main/java/com/etl/data/service/impl/DataSourceServiceImpl.java
index dbb62a1..4c0251a 100644
--- a/etl-modules/etl-data-source/etl-data-source-server/src/main/java/com/etl/data/service/impl/DataSourceServiceImpl.java
+++ b/etl-modules/etl-data-source/etl-data-source-server/src/main/java/com/etl/data/service/impl/DataSourceServiceImpl.java
@@ -8,6 +8,7 @@ import com.etl.common.core.utils.StringUtils;
import com.etl.common.security.utils.SecurityUtils;
import com.etl.common.system.domain.SysRole;
+import com.etl.data.controller.DataSourceController;
import com.etl.data.domain.*;
import com.etl.data.domain.Dictionary;
import com.etl.data.domain.custom.Statistics;
@@ -65,6 +66,8 @@ public class DataSourceServiceImpl extends ServiceImpl selectDataSourceList(DataSourceQueryReq req) {
List< DataSource > dataSources = this.list ( );
+ String s = DataSourceController.local.get ( );
+
// List dataSourceList = new ArrayList();
// List roles = SecurityUtils.getLoginUser().getSysUser().getRoles();
// //判断登录人是否为管理员,不是则需要过滤掉未授权的信息