From 5b4e7730efe10f763916145c12e5d3fcd7e9a79f Mon Sep 17 00:00:00 2001 From: taojinlong Date: Mon, 22 Sep 2025 17:06:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=A0=A1=E9=AA=8C=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/provider/CalciteProvider.java | 423 +++++++++--------- .../datasource/server/DatasourceServer.java | 20 +- .../datasource/server/EngineServer.java | 6 +- .../visualized/data/datasource/index.vue | 5 + 4 files changed, 238 insertions(+), 216 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java index 5f0a9eace6..ef67826660 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java @@ -936,7 +936,7 @@ public class CalciteProvider extends Provider { calciteConnection = connection.unwrap(CalciteConnection.class); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDsList(dsMap); - buildSchema(datasourceRequest, calciteConnection); + buildRootSchema(datasourceRequest, calciteConnection); return connection; } @@ -971,223 +971,224 @@ public class CalciteProvider extends Provider { } // 构建root schema - private SchemaPlus buildSchema(DatasourceRequest datasourceRequest, CalciteConnection calciteConnection) { + private SchemaPlus buildRootSchema(DatasourceRequest datasourceRequest, CalciteConnection calciteConnection) { SchemaPlus rootSchema = calciteConnection.getRootSchema(); Map dsList = datasourceRequest.getDsList(); for (Map.Entry next : dsList.entrySet()) { DatasourceSchemaDTO ds = next.getValue(); commonThreadPool.addTask(() -> { try { - BasicDataSource dataSource = new BasicDataSource(); - dataSource.setMaxWaitMillis(5 * 1000); - dataSource.setTestWhileIdle(true); - dataSource.setTestOnBorrow(true); - dataSource.setTestOnReturn(true); - dataSource.setTimeBetweenEvictionRunsMillis(60 * 1000); - dataSource.setValidationQuery("select 1"); - dataSource.setValidationQueryTimeout(5); - Schema schema = null; - DatasourceConfiguration configuration = null; - DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(ds.getType()); - try { - if (rootSchema.getSubSchema(ds.getSchemaAlias()) != null) { - JdbcSchema jdbcSchema = rootSchema.getSubSchema(ds.getSchemaAlias()).unwrap(JdbcSchema.class); - BasicDataSource basicDataSource = (BasicDataSource) jdbcSchema.getDataSource(); - basicDataSource.close(); - rootSchema.removeSubSchema(ds.getSchemaAlias()); - } - switch (datasourceType) { - case mysql: - case mongo: - case mariadb: - case TiDB: - case StarRocks: - case doris: - configuration = JsonUtil.parseObject(ds.getConfiguration(), Mysql.class); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); - rootSchema.add(ds.getSchemaAlias(), schema); - break; - case impala: - configuration = JsonUtil.parseObject(ds.getConfiguration(), Impala.class); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); - rootSchema.add(ds.getSchemaAlias(), schema); - break; - case sqlServer: - configuration = JsonUtil.parseObject(ds.getConfiguration(), Sqlserver.class); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - dataSource.setDefaultSchema(configuration.getSchema()); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); - rootSchema.add(ds.getSchemaAlias(), schema); - break; - case oracle: - dataSource.setValidationQuery("SELECT 1 FROM DUAL"); - configuration = JsonUtil.parseObject(ds.getConfiguration(), Oracle.class); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - dataSource.setConnectionInitSqls(Collections.singletonList( - "ALTER SESSION SET CURRENT_SCHEMA = " + configuration.getSchema() - )); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); - rootSchema.add(ds.getSchemaAlias(), schema); - break; - case db2: - configuration = JsonUtil.parseObject(ds.getConfiguration(), Db2.class); - dataSource.setValidationQuery("select 1 from syscat.tables WHERE TABSCHEMA ='DE_SCHEMA' AND \"TYPE\" = 'T'".replace("DE_SCHEMA", configuration.getSchema())); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); - rootSchema.add(ds.getSchemaAlias(), schema); - break; - case ck: - configuration = JsonUtil.parseObject(ds.getConfiguration(), CK.class); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); - rootSchema.add(ds.getSchemaAlias(), schema); - break; - case pg: - configuration = JsonUtil.parseObject(ds.getConfiguration(), Pg.class); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); - rootSchema.add(ds.getSchemaAlias(), schema); - break; - case redshift: - configuration = JsonUtil.parseObject(ds.getConfiguration(), Redshift.class); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); - rootSchema.add(ds.getSchemaAlias(), schema); - break; - case h2: - configuration = JsonUtil.parseObject(ds.getConfiguration(), H2.class); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); - rootSchema.add(ds.getSchemaAlias(), schema); - break; - default: - configuration = JsonUtil.parseObject(ds.getConfiguration(), Mysql.class); - if (StringUtils.isNotBlank(configuration.getUsername())) { - dataSource.setUsername(configuration.getUsername()); - } - if (StringUtils.isNotBlank(configuration.getPassword())) { - dataSource.setPassword(configuration.getPassword()); - } - dataSource.setInitialSize(configuration.getInitialPoolSize()); - dataSource.setMaxTotal(configuration.getMaxPoolSize()); - dataSource.setMinIdle(configuration.getMinPoolSize()); - dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); - startSshSession(configuration, null, ds.getId()); - dataSource.setUrl(configuration.getJdbc()); - schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); - rootSchema.add(ds.getSchemaAlias(), schema); - } - } catch (Exception e) { - LogUtil.error("Fail to create connection: " + ds.getName(), e); - } + buildSchema(ds, rootSchema); } catch (Exception e) { + LogUtil.error("Fail to create connection: " + ds.getName(), e); } }); } return rootSchema; } + private void buildSchema(DatasourceSchemaDTO ds, SchemaPlus rootSchema) throws Exception { + BasicDataSource dataSource = new BasicDataSource(); + dataSource.setMaxWaitMillis(5 * 1000); + dataSource.setTestWhileIdle(true); + dataSource.setTestOnBorrow(true); + dataSource.setTestOnReturn(true); + dataSource.setTimeBetweenEvictionRunsMillis(60 * 1000); + dataSource.setValidationQuery("select 1"); + dataSource.setValidationQueryTimeout(5); + Schema schema = null; + DatasourceConfiguration configuration = null; + DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(ds.getType()); + if (rootSchema.getSubSchema(ds.getSchemaAlias()) != null) { + JdbcSchema jdbcSchema = rootSchema.getSubSchema(ds.getSchemaAlias()).unwrap(JdbcSchema.class); + BasicDataSource basicDataSource = (BasicDataSource) jdbcSchema.getDataSource(); + basicDataSource.close(); + rootSchema.removeSubSchema(ds.getSchemaAlias()); + } + switch (datasourceType) { + case mysql: + case mongo: + case mariadb: + case TiDB: + case StarRocks: + case doris: + configuration = JsonUtil.parseObject(ds.getConfiguration(), Mysql.class); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); + rootSchema.add(ds.getSchemaAlias(), schema); + break; + case impala: + configuration = JsonUtil.parseObject(ds.getConfiguration(), Impala.class); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); + rootSchema.add(ds.getSchemaAlias(), schema); + break; + case sqlServer: + configuration = JsonUtil.parseObject(ds.getConfiguration(), Sqlserver.class); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + dataSource.setDefaultSchema(configuration.getSchema()); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); + rootSchema.add(ds.getSchemaAlias(), schema); + break; + case oracle: + dataSource.setValidationQuery("SELECT 1 FROM DUAL"); + configuration = JsonUtil.parseObject(ds.getConfiguration(), Oracle.class); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + dataSource.setConnectionInitSqls(Collections.singletonList( + "ALTER SESSION SET CURRENT_SCHEMA = " + configuration.getSchema() + )); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); + rootSchema.add(ds.getSchemaAlias(), schema); + break; + case db2: + configuration = JsonUtil.parseObject(ds.getConfiguration(), Db2.class); + dataSource.setValidationQuery("select 1 from syscat.tables WHERE TABSCHEMA ='DE_SCHEMA' AND \"TYPE\" = 'T'".replace("DE_SCHEMA", configuration.getSchema())); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); + rootSchema.add(ds.getSchemaAlias(), schema); + break; + case ck: + configuration = JsonUtil.parseObject(ds.getConfiguration(), CK.class); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); + rootSchema.add(ds.getSchemaAlias(), schema); + break; + case pg: + configuration = JsonUtil.parseObject(ds.getConfiguration(), Pg.class); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); + rootSchema.add(ds.getSchemaAlias(), schema); + break; + case redshift: + configuration = JsonUtil.parseObject(ds.getConfiguration(), Redshift.class); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); + rootSchema.add(ds.getSchemaAlias(), schema); + break; + case h2: + configuration = JsonUtil.parseObject(ds.getConfiguration(), H2.class); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); + rootSchema.add(ds.getSchemaAlias(), schema); + break; + default: + configuration = JsonUtil.parseObject(ds.getConfiguration(), Mysql.class); + if (StringUtils.isNotBlank(configuration.getUsername())) { + dataSource.setUsername(configuration.getUsername()); + } + if (StringUtils.isNotBlank(configuration.getPassword())) { + dataSource.setPassword(configuration.getPassword()); + } + dataSource.setInitialSize(configuration.getInitialPoolSize()); + dataSource.setMaxTotal(configuration.getMaxPoolSize()); + dataSource.setMinIdle(configuration.getMinPoolSize()); + dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + startSshSession(configuration, null, ds.getId()); + dataSource.setUrl(configuration.getJdbc()); + schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getDataBase()); + rootSchema.add(ds.getSchemaAlias(), schema); + } + } + private List getDataResult(ResultSet rs) { List list = new LinkedList<>(); try { @@ -1572,18 +1573,14 @@ public class CalciteProvider extends Provider { } - public void update(DatasourceDTO datasourceDTO) throws DEException { + public void update(DatasourceDTO datasourceDTO) throws Exception { DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO(); BeanUtils.copyBean(datasourceSchemaDTO, datasourceDTO); datasourceSchemaDTO.setSchemaAlias(String.format(SQLConstants.SCHEMA, datasourceSchemaDTO.getId())); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDsList(Map.of(datasourceSchemaDTO.getId(), datasourceSchemaDTO)); - try { - CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class); - SchemaPlus rootSchema = buildSchema(datasourceRequest, calciteConnection); - } catch (Exception e) { - DEException.throwException(e.getMessage()); - } + CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class); + buildSchema(datasourceSchemaDTO, calciteConnection.getRootSchema()); } public void updateDsPoolAfterCheckStatus(DatasourceDTO datasourceDTO) throws DEException { @@ -1596,7 +1593,7 @@ public class CalciteProvider extends Provider { CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class); SchemaPlus rootSchema = calciteConnection.getRootSchema(); if (rootSchema.getSubSchema(datasourceSchemaDTO.getSchemaAlias()) == null) { - buildSchema(datasourceRequest, calciteConnection); + buildSchema(datasourceSchemaDTO, rootSchema); } DatasourceConfiguration configuration = JsonUtil.parseObject(datasourceDTO.getConfiguration(), DatasourceConfiguration.class); if (configuration.isUseSSH()) { diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java index 7f3c700e5d..c5d12d90b8 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java @@ -365,7 +365,15 @@ public class DatasourceServer implements DatasourceApi { datasourceSyncManage.addSchedule(coreDatasourceTask); } else { checkParams(dataSourceDTO.getConfiguration()); - calciteProvider.update(dataSourceDTO); + commonThreadPool.addTask(() -> { + try { + calciteProvider.update(dataSourceDTO); + } catch (Exception e) { + CoreDatasource ds = coreDatasourceRepository.findById(coreDatasource.getId()).orElse(null); + ds.setStatus("Error"); + dataSourceManage.innerEditStatus(ds); + } + }); } return dataSourceDTO; } @@ -500,7 +508,15 @@ public class DatasourceServer implements DatasourceApi { checkParams(dataSourceDTO.getConfiguration()); dataSourceManage.checkName(dataSourceDTO); dataSourceManage.innerEdit(requestDatasource); - calciteProvider.update(dataSourceDTO); + commonThreadPool.addTask(() -> { + try { + calciteProvider.update(dataSourceDTO); + } catch (Exception e) { + CoreDatasource datasource = coreDatasourceRepository.findById(requestDatasource.getId()).orElse(null); + datasource.setStatus("Error"); + dataSourceManage.innerEditStatus(datasource); + } + }); } return dataSourceDTO; } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/EngineServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/EngineServer.java index 3303dfe409..229f2bb7b2 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/EngineServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/EngineServer.java @@ -75,7 +75,11 @@ public class EngineServer implements EngineApi { } else { coreDeEngineRepository.saveAndFlush(coreDeEngine); } - calciteProvider.update(datasourceDTO); + try { + calciteProvider.update(datasourceDTO); + } catch (Exception e) { + e.printStackTrace(); + } } @Override diff --git a/core/core-frontend/src/views/visualized/data/datasource/index.vue b/core/core-frontend/src/views/visualized/data/datasource/index.vue index bfa7fefd7f..4b0928c6d7 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/index.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/index.vue @@ -201,6 +201,7 @@ const datasetTypeList = computed(() => { }) const dsTableDataLoading = ref(false) +const validateDsLoading = ref(false) const selectDataset = row => { Object.assign(dsTableDetail, row) userDrawer.value = true @@ -291,8 +292,10 @@ const handleLoadExcel = data => { const validateDS = () => { let nodeTmpInfo = reactive(cloneDeep(defaultInfo)) Object.assign(nodeTmpInfo, cloneDeep(nodeInfo)) + validateDsLoading.value = true validateById(nodeTmpInfo.id as number) .then(res => { + validateDsLoading.value = false if (res.data.type.startsWith('API')) { let error = 0 const dsStatus = JSON.parse(res.data.status) @@ -319,6 +322,7 @@ const validateDS = () => { } }) .catch(() => { + validateDsLoading.value = false changeDsStatus(state.datasourceTree, nodeTmpInfo.id, -Math.abs(nodeTmpInfo.extraFlag)) }) } @@ -1317,6 +1321,7 @@ const getMenuList = (val: boolean) => { {{ t('datasource.validate') }}