优化数据源初始化和获取逻辑

This commit is contained in:
暮光:城中城
2020-05-16 08:54:11 +08:00
parent 18d8105344
commit c89f3696ea
15 changed files with 106 additions and 124 deletions

View File

@@ -114,7 +114,7 @@ public class DatabaseDocController {
return DocDbResponseJson.ok(resultObj);
}
BaseMapper baseMapper = this.getBaseMapper(sourceId);
DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getFactoryById(sourceId);
DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getOrCreateFactoryById(sourceId);
List<DatabaseInfoDto> dbNameDtoList = baseMapper.getDatabaseList();
Map<String, List<TableInfoDto>> dbTableMap = new HashMap<>();
Map<String, List<TableColumnDescDto>> tableColumnsMap = new HashMap<>();
@@ -162,7 +162,7 @@ public class DatabaseDocController {
public ResponseJson getTableDdl(Long sourceId, String dbName, String tableName) {
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
Map<String, String> dataMap = baseMapper.getTableDdl(dbName, tableName);
DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getFactoryById(sourceId);
DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getOrCreateFactoryById(sourceId);
// 不同数据源类型获取方式不一致
if (Objects.equals(DatabaseProduct.MYSQL, databaseFactoryBean.getDatabaseProduct())) {
return DocDbResponseJson.ok(dataMap.get("Create Table"));
@@ -181,7 +181,7 @@ public class DatabaseDocController {
public ResponseJson getTableStatus(Long sourceId, String dbName, String tableName) {
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
TableStatusVo tableStatusVo = baseMapper.getTableStatus(dbName, tableName);
DatabaseFactoryBean factoryBean = databaseRegistrationBean.getFactoryById(sourceId);
DatabaseFactoryBean factoryBean = databaseRegistrationBean.getOrCreateFactoryById(sourceId);
tableStatusVo.setDbType(factoryBean.getDatabaseProduct().name().toLowerCase());
return DocDbResponseJson.ok(tableStatusVo);
}
@@ -196,7 +196,7 @@ public class DatabaseDocController {
@PostMapping(value = "/getTableColumnList")
public ResponseJson getTableColumnList(Long sourceId, String dbName, String tableName) {
this.judgeAuth(sourceId, DbAuthType.VIEW.getName(), "没有查看该库表信息的权限");
DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getFactoryById(sourceId);
DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getOrCreateFactoryById(sourceId);
if (databaseFactoryBean == null) {
return DocDbResponseJson.warn("未找到对应的数据库连接");
}
@@ -267,7 +267,7 @@ public class DatabaseDocController {
if (StringUtils.isBlank(tableNames)) {
return DocDbResponseJson.warn("请选择需要导出的表");
}
DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getFactoryById(sourceId);
DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getOrCreateFactoryById(sourceId);
if (databaseFactoryBean == null) {
return DocDbResponseJson.warn("未找到对应的数据库连接");
}

View File

@@ -77,31 +77,17 @@ public class DbDatasourceController {
dbDatasource.setYn(1);
dbDatasourceService.save(dbDatasource);
}
// 关闭数据源
databaseRegistrationBean.closeDatasource(dbDatasource.getId());
// 验证新的数据源
DbDatasource dbDatasourceSel = dbDatasourceService.getById(dbDatasource.getId());
List<DatabaseFactoryBean> newFactoryBeanList = new LinkedList<>();
List<DatabaseFactoryBean> databaseFactoryBeanList = databaseRegistrationBean.getDatabaseFactoryBeanList();
for (DatabaseFactoryBean factoryBean : databaseFactoryBeanList) {
if (Objects.equals(factoryBean.getId(), sourceId)) {
try {
// 关闭旧的数据源
factoryBean.getDataSource().close();
} catch (Exception e) {
e.printStackTrace();
}
} else {
newFactoryBeanList.add(factoryBean);
}
}
if (Optional.ofNullable(dbDatasourceSel.getYn()).orElse(0) == 1) {
if (Objects.equals(dbDatasourceSel.getYn(), 1)) {
// 创建新的数据源
DatabaseFactoryBean databaseFactoryBean = DatasourceUtil.createDatabaseFactoryBean(dbDatasourceSel);
if (databaseFactoryBean != null) {
newFactoryBeanList.add(databaseFactoryBean);
}
databaseRegistrationBean.setDatabaseFactoryBeanList(newFactoryBeanList);
if (databaseFactoryBean == null) {
return DocDbResponseJson.warn("创建数据源失败,请检查配置是否正确");
}
databaseFactoryBean.getDataSource().close();
}
return DocDbResponseJson.ok();
}

View File

@@ -1,40 +1,15 @@
package com.zyplayer.doc.db.framework.configuration;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zyplayer.doc.data.repository.manage.entity.DbDatasource;
import com.zyplayer.doc.data.service.manage.DbDatasourceService;
import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean;
import com.zyplayer.doc.db.framework.db.bean.DatabaseRegistrationBean;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.LinkedList;
import java.util.List;
@Component
public class ApplicationListenerBean implements ApplicationListener<ContextRefreshedEvent> {
@Resource
DatabaseRegistrationBean databaseRegistrationBean;
@Resource
DbDatasourceService dbDatasourceService;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
List<DatabaseFactoryBean> databaseFactoryBeanList = new LinkedList<>();
QueryWrapper<DbDatasource> wrapper = new QueryWrapper<>();
wrapper.eq("yn", 1);
List<DbDatasource> datasourceList = dbDatasourceService.list(wrapper);
for (DbDatasource dbDatasource : datasourceList) {
DatabaseFactoryBean databaseFactoryBean = DatasourceUtil.createDatabaseFactoryBean(dbDatasource);
if (databaseFactoryBean != null) {
databaseFactoryBeanList.add(databaseFactoryBean);
}
}
databaseRegistrationBean.setDatabaseFactoryBeanList(databaseFactoryBeanList);
}
}

View File

@@ -16,13 +16,11 @@ public class DatasourceUtil {
public static DatabaseFactoryBean createDatabaseFactoryBean(DbDatasource dbDatasource){
try {
// 数据源配置
DruidDataSource dataSource = DruidDataSourceUtil.createDataSource(dbDatasource.getDriverClassName(), dbDatasource.getSourceUrl(), dbDatasource.getSourceName(), dbDatasource.getSourcePassword());
Resource[] resources = null;
// 描述连接信息的对象
DatabaseFactoryBean databaseFactoryBean = new DatabaseFactoryBean();
Resource[] resources = null;
String dbUrl = dbDatasource.getSourceUrl();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
String dbUrl = dbDatasource.getSourceUrl();
if (dbUrl.contains("mysql")) {
// jdbc:mysql://192.168.0.1:3306/user_info?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
String[] urlParamArr = dbUrl.split("\\?");
@@ -62,6 +60,8 @@ public class DatasourceUtil {
if (resources == null) {
return null;
}
// 数据源配置
DruidDataSource dataSource = DruidDataSourceUtil.createDataSource(dbDatasource.getDriverClassName(), dbDatasource.getSourceUrl(), dbDatasource.getSourceName(), dbDatasource.getSourcePassword());
// 创建sqlSessionTemplate
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);

View File

@@ -1,41 +1,41 @@
package com.zyplayer.doc.db.framework.db.bean;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.data.repository.manage.entity.DbDatasource;
import com.zyplayer.doc.data.service.manage.DbDatasourceService;
import com.zyplayer.doc.db.framework.configuration.DatasourceUtil;
import com.zyplayer.doc.db.framework.db.mapper.base.BaseMapper;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 需要声明注入的对象只需要设置dbConfigList即可
* databaseFactoryBeanList是后面生成的
* 所有的数据源管理类
*
* @author 暮光:城中城
* @since 2018年8月8日
*/
@Repository
public class DatabaseRegistrationBean {
// 注入此对象必须配置的参数
// 配置的数据源连接、账号密码等信息,通过注入得到
private List<DbConfigBean> dbConfigList = new LinkedList<>();
@Resource
DbDatasourceService dbDatasourceService;
// 描述连接信息的对象列表
private List<DatabaseFactoryBean> databaseFactoryBeanList = new LinkedList<>();
public List<DatabaseFactoryBean> getDatabaseFactoryBeanList() {
return databaseFactoryBeanList;
}
public void setDatabaseFactoryBeanList(List<DatabaseFactoryBean> databaseFactoryBeanList) {
this.databaseFactoryBeanList = databaseFactoryBeanList;
}
public BaseMapper getBaseMapper(Long sourceId) {
return getBaseMapper(sourceId, BaseMapper.class);
}
private Map<Long, DatabaseFactoryBean> databaseFactoryBeanMap = new ConcurrentHashMap<>();
/**
* 获取BaseMapper
*
* @param sourceId 数据源ID
* @param cls 指定类
* @return BaseMapper
*/
public <T> T getBaseMapper(Long sourceId, Class<T> cls) {
DatabaseFactoryBean factoryBean = getFactoryById(sourceId);
DatabaseFactoryBean factoryBean = getOrCreateFactoryById(sourceId);
if (factoryBean != null) {
SqlSessionTemplate sessionTemplate = factoryBean.getSqlSessionTemplate();
try {
@@ -47,17 +47,14 @@ public class DatabaseRegistrationBean {
return null;
}
public DatabaseFactoryBean getFactoryById(Long sourceId) {
for (DatabaseFactoryBean databaseFactoryBean : databaseFactoryBeanList) {
if (Objects.equals(databaseFactoryBean.getId(), sourceId)) {
return databaseFactoryBean;
}
}
return null;
}
/**
* 获取BaseMapper
*
* @param sourceId 数据源ID
* @return BaseMapper
*/
public BaseMapper getBaseMapperById(Long sourceId) {
DatabaseFactoryBean databaseFactoryBean = this.getFactoryById(sourceId);
DatabaseFactoryBean databaseFactoryBean = this.getOrCreateFactoryById(sourceId);
if (databaseFactoryBean == null) {
return null;
}
@@ -70,11 +67,53 @@ public class DatabaseRegistrationBean {
return null;
}
public List<DbConfigBean> getDbConfigList() {
return dbConfigList;
/**
* 关闭数据源
*
* @param sourceId 数据源ID
*/
public void closeDatasource(Long sourceId) {
DatabaseFactoryBean factoryBean = databaseFactoryBeanMap.remove(sourceId);
if (factoryBean != null) {
try {
// 关闭数据源
factoryBean.getDataSource().close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void setDbConfigList(List<DbConfigBean> dbConfigList) {
this.dbConfigList = dbConfigList;
/**
* 通过数据源ID获取或创建新的数据源
*
* @param sourceId 数据源ID
* @return 数据源对象
*/
public DatabaseFactoryBean getOrCreateFactoryById(Long sourceId) {
DatabaseFactoryBean factoryBean = databaseFactoryBeanMap.get(sourceId);
if (factoryBean != null) return factoryBean;
return this.createFactoryById(sourceId);
}
/**
* 创建数据源的同步方法
*
* @param sourceId 数据源ID
* @return 新数据源对象
*/
private synchronized DatabaseFactoryBean createFactoryById(Long sourceId) {
DatabaseFactoryBean factoryBean = databaseFactoryBeanMap.get(sourceId);
if (factoryBean != null) return factoryBean;
DbDatasource dbDatasource = dbDatasourceService.getById(sourceId);
if (dbDatasource == null) {
throw new ConfirmException("未找到指定数据源配置信息:" + sourceId);
}
DatabaseFactoryBean databaseFactoryBean = DatasourceUtil.createDatabaseFactoryBean(dbDatasource);
if (databaseFactoryBean == null) {
throw new ConfirmException("创建数据源失败:" + sourceId);
}
databaseFactoryBeanMap.put(sourceId, databaseFactoryBean);
return databaseFactoryBean;
}
}

View File

@@ -65,7 +65,7 @@ public class SqlExecutor {
* @since 2019年8月18日
*/
public ExecuteResult execute(ExecuteParam param) {
DatabaseFactoryBean factoryBean = databaseRegistrationBean.getFactoryById(param.getDatasourceId());
DatabaseFactoryBean factoryBean = databaseRegistrationBean.getOrCreateFactoryById(param.getDatasourceId());
return this.execute(factoryBean, param, null);
}

View File

@@ -122,7 +122,7 @@ public class TransferDataServer {
String querySql = transferTask.getQuerySql();
String storageSql = transferTask.getStorageSql();
List<Map<String, Object>> selectResultList = new LinkedList<>();
DatabaseFactoryBean factoryBean = databaseRegistrationBean.getFactoryById(querySourceId);
DatabaseFactoryBean factoryBean = databaseRegistrationBean.getOrCreateFactoryById(querySourceId);
ExecuteParam executeParam = new ExecuteParam();
executeParam.setDatasourceId(querySourceId);
executeParam.setExecuteType(ExecuteType.SELECT);

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={2:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(a);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+""+e+".js?"+{0:"816b76cc3007c7726f16",1:"1ecabc6d379552a7c3f7"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,u.appendChild(i),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=doc-db-manifest.js.map?11ddea231a2159bfc0e8
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var a,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={2:0};n.e=function(e){function r(){a.onerror=a.onload=null,clearTimeout(i);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,n.nc&&a.setAttribute("nonce",n.nc),a.src=n.p+""+e+".js?"+{0:"3138591b4af9fb40e531",1:"1ecabc6d379552a7c3f7"}[e];var i=setTimeout(r,12e4);return a.onerror=a.onload=r,u.appendChild(a),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=doc-db-manifest.js.map?075412feecc8b570efae

View File

@@ -8,7 +8,7 @@
<body>
<div id="app"></div>
<script type="text/javascript" src="doc-db-manifest.js?11ddea231a2159bfc0e8"></script><script type="text/javascript" src="doc-db-vendor.js?1ecabc6d379552a7c3f7"></script><script type="text/javascript" src="doc-db-index.js?816b76cc3007c7726f16"></script></body>
<script type="text/javascript" src="doc-db-manifest.js?075412feecc8b570efae"></script><script type="text/javascript" src="doc-db-vendor.js?1ecabc6d379552a7c3f7"></script><script type="text/javascript" src="doc-db-index.js?3138591b4af9fb40e531"></script></body>
</html>

View File

@@ -1,13 +1,10 @@
package com.zyplayer.doc.manage.framework.config;
import com.zyplayer.doc.db.framework.configuration.EnableDocDb;
import com.zyplayer.doc.db.framework.db.bean.DatabaseRegistrationBean;
import com.zyplayer.doc.dubbo.framework.config.EnableDocDubbo;
import com.zyplayer.doc.elasticsearch.framework.config.EnableDocEs;
import com.zyplayer.doc.swagger.framework.configuration.EnableDocSwagger;
import com.zyplayer.doc.wiki.framework.config.EnableDocWiki;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
@@ -36,10 +33,4 @@ public class ZyplayerDocConfig {
@EnableDocSwagger(selfDoc = false)
public class enableDocSwagger{}
@Bean
@ConfigurationProperties(prefix = "zyplayer.doc.db")
public DatabaseRegistrationBean databaseRegistrationBean() {
return new DatabaseRegistrationBean();
}
}

View File

@@ -1,5 +1,6 @@
package com.zyplayer.doc.manage.framework.interceptor;
import cn.hutool.http.HttpUtil;
import com.zyplayer.doc.core.util.ThreadLocalUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,8 +29,8 @@ public class RequestInfoInterceptor implements HandlerInterceptor {
Long startTime = startTimeThreadLocal.get();
startTime = Optional.ofNullable(startTime).orElse(System.currentTimeMillis());
long totalTime = System.currentTimeMillis() - startTime;// 结束时间
logger.info("总耗时:{}msURI{}", totalTime, request.getRequestURI());
String clientIP = HttpUtil.getClientIP(request);
logger.info("IP{},总耗时:{}msURI{}", clientIP, totalTime, request.getRequestURI());
ThreadLocalUtil.clean();
startTimeThreadLocal.remove();
}

View File

@@ -12,16 +12,6 @@
</el-select>
</div>
<el-menu :router="true" class="el-menu-vertical" style="height: auto;">
<!-- <el-menu-item index="/"><i class="el-icon-s-home"></i>控制台</el-menu-item>-->
<!-- <el-submenu index="1">-->
<!-- <template slot="title">-->
<!-- <i class="el-icon-s-platform"></i>-->
<!-- <span slot="title">系统管理</span>-->
<!-- </template>-->
<!-- <el-menu-item index="/data/datasourceManage"><i class="el-icon-coin"></i>数据源管理</el-menu-item>-->
<!-- <el-menu-item index="/data/executor"><i class="el-icon-video-play"></i>SQL执行器</el-menu-item>-->
<!-- <el-menu-item index="/data/export"><i class="el-icon-finished"></i>数据库表导出</el-menu-item>-->
<!-- </el-submenu>-->
<el-menu-item index="/data/datasourceManage"><i class="el-icon-coin"></i>数据源管理</el-menu-item>
<el-menu-item index="/data/executor"><i class="el-icon-video-play"></i>SQL执行器</el-menu-item>
<el-submenu index="1">

View File

@@ -104,7 +104,7 @@
mounted: function () {
let that = this;
this.sqlExecutorEditor = this.initAceEditor("sqlExecutorEditor", 6);
this.sqlExecutorEditor.setFontSize(18);
this.sqlExecutorEditor.setFontSize(16);
this.sqlExecutorEditor.commands.addCommand({
name: "execute-sql",
bindKey: {win: "Ctrl-R|Ctrl-Shift-R|Ctrl-Enter", mac: "Command-R|Command-Shift-R|Command-Enter"},
@@ -305,7 +305,7 @@
enableSnippets: true,
enableLiveAutocompletion: true,
minLines: minLines,
maxLines: 30,
maxLines: 40,
});
},
}

View File

@@ -116,7 +116,7 @@
// 下面两行先后顺序不能改
this.addEditorCompleter();
this.sqlExecutorEditor = this.initAceEditor("sqlExecutorEditor", 15);
this.sqlExecutorEditor.setFontSize(18);
this.sqlExecutorEditor.setFontSize(16);
let that = this;
this.sqlExecutorEditor.commands.addCommand({
name: "execute-sql",
@@ -137,7 +137,7 @@
enableSnippets: true,
enableLiveAutocompletion: true,
minLines: minLines,
maxLines: 30,
maxLines: 40,
});
},
cancelExecutorSql() {