first commit
This commit is contained in:
@ -1,5 +1,6 @@
|
|||||||
package com.qiaoba.api.system.entity;
|
package com.qiaoba.api.system.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.qiaoba.common.base.entity.BaseEntity;
|
import com.qiaoba.common.base.entity.BaseEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -21,17 +22,12 @@ public class SysTenant extends BaseEntity {
|
|||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private Long id;
|
@TableId
|
||||||
|
private Long tenantId;
|
||||||
|
|
||||||
private String code;
|
private String tenantCode;
|
||||||
|
|
||||||
private String name;
|
private String tenantName;
|
||||||
|
|
||||||
private String domainName;
|
|
||||||
|
|
||||||
private Date expiryDate;
|
|
||||||
|
|
||||||
private String contact;
|
|
||||||
|
|
||||||
private String province;
|
private String province;
|
||||||
|
|
||||||
@ -41,5 +37,14 @@ public class SysTenant extends BaseEntity {
|
|||||||
|
|
||||||
private String address;
|
private String address;
|
||||||
|
|
||||||
|
private String contactUser;
|
||||||
|
|
||||||
|
private String contactPhone;
|
||||||
|
|
||||||
|
private String dataType;
|
||||||
|
|
||||||
|
private Date expireTime;
|
||||||
|
|
||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,32 @@
|
|||||||
spring:
|
qiaoba:
|
||||||
datasource:
|
datasource:
|
||||||
url: jdbc:mysql://121.5.136.69:3306/qiaoba-boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
master:
|
||||||
username: root
|
driver: com.mysql.cj.jdbc.Driver
|
||||||
password: LpYN7LUoL?l0OSpR2
|
url: jdbc:mysql://121.5.136.69:3306/qiaoba-boot-1?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
||||||
type: com.alibaba.druid.pool.DruidDataSource
|
username: root
|
||||||
druid:
|
password: LpYN7LUoL?l0OSpR2
|
||||||
initial-size: 5 #连接池初始化大小
|
pool:
|
||||||
min-idle: 10 #最小空闲连接数
|
init: 5 #连接池初始化大小
|
||||||
max-active: 20 #最大连接数
|
min: 10 #最小空闲连接数
|
||||||
|
max: 20 #最大连接数
|
||||||
|
slaves:
|
||||||
|
- driver: com.mysql.cj.jdbc.Driver
|
||||||
|
url: jdbc:mysql://121.5.136.69:3306/qiaoba-boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
||||||
|
username: root
|
||||||
|
password: LpYN7LUoL?l0OSpR2
|
||||||
|
pool:
|
||||||
|
init: 5
|
||||||
|
min: 10
|
||||||
|
max: 20
|
||||||
|
weight: 2 #权重 默认 1
|
||||||
|
is-use: true #是否使用 默认 true
|
||||||
|
- driver: com.mysql.cj.jdbc.Driver
|
||||||
|
url: jdbc:mysql://127.0.0.1:3306/qiaoba-boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
|
||||||
|
username: root
|
||||||
|
password: root
|
||||||
|
pool:
|
||||||
|
init: 5
|
||||||
|
min: 10
|
||||||
|
max: 20
|
||||||
|
is-use: false # 不使用该库
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
server:
|
server:
|
||||||
port: 80
|
port: 80
|
||||||
spring:
|
spring:
|
||||||
|
main:
|
||||||
|
allow-bean-definition-overriding: true #新创建的bean覆盖旧的bean
|
||||||
application:
|
application:
|
||||||
name: qiaoba-boot
|
name: qiaoba-boot
|
||||||
profiles:
|
profiles:
|
||||||
@ -13,8 +15,7 @@ spring:
|
|||||||
jackson:
|
jackson:
|
||||||
date-format: yyyy-MM-dd HH:mm:ss
|
date-format: yyyy-MM-dd HH:mm:ss
|
||||||
time-zone: GMT+8
|
time-zone: GMT+8
|
||||||
main:
|
|
||||||
allow-bean-definition-overriding: true
|
|
||||||
|
|
||||||
|
|
||||||
# springdoc-openapi项目配置
|
# springdoc-openapi项目配置
|
||||||
|
@ -1,14 +1,23 @@
|
|||||||
package com.qiaoba.common.database.config;
|
package com.qiaoba.common.database.config;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import com.alibaba.druid.pool.DruidDataSource;
|
import com.alibaba.druid.pool.DruidDataSource;
|
||||||
import com.qiaoba.common.database.entity.DynamicDataSource;
|
import com.qiaoba.common.database.constants.DynamicDatasourceConstant;
|
||||||
import org.springframework.context.annotation.Bean;
|
import com.qiaoba.common.database.properties.DefaultDataSourceProperties;
|
||||||
|
import com.qiaoba.common.database.properties.MasterInfo;
|
||||||
|
import com.qiaoba.common.database.properties.PoolInfo;
|
||||||
|
import com.qiaoba.common.database.properties.SlaveInfo;
|
||||||
|
import com.qiaoba.common.database.utils.JdbcUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Primary;
|
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.Resource;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.HashMap;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 全局跨域配置
|
* 全局跨域配置
|
||||||
@ -17,67 +26,62 @@ import java.util.Map;
|
|||||||
* @version 1.0
|
* @version 1.0
|
||||||
* @since 2021/10/15 0015 下午 16:43
|
* @since 2021/10/15 0015 下午 16:43
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Configuration
|
@Configuration
|
||||||
public class DynamicDataSourceConfig {
|
public class DynamicDataSourceConfig {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DynamicDataSourceContext dataSource;
|
||||||
|
@Resource
|
||||||
|
private DefaultDataSourceProperties defaultDataSourceProperties;
|
||||||
|
|
||||||
|
public static Map<Object, Object> DATA_SOURCE_MAP = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 把DynamicDataSourceContext 纳入容器管理,其他地方使用DynamicDataSourceConfig 类可以直接从容器取对象,并调用freshDataSource方法
|
* 把DynamicDataSourceContext 纳入容器管理,其他地方使用DynamicDataSourceConfig 类可以直接从容器取对象,并调用freshDataSource方法
|
||||||
*/
|
*/
|
||||||
@Bean
|
@PostConstruct
|
||||||
@Primary
|
public void init() {
|
||||||
public static DynamicDataSourceContext dataSource() {
|
MasterInfo master = defaultDataSourceProperties.getMaster();
|
||||||
Map<Object, Object> targetDataSource = getDataSource();
|
List<SlaveInfo> slaves = defaultDataSourceProperties.getSlaves();
|
||||||
//把DynamicDataSourceContext纳入容器管理
|
addDataSourceToMap(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY, buildDataSource(master.getDriver(), master.getUrl(), master.getUsername(), master.getPassword(), master.getPool()));
|
||||||
DynamicDataSourceContext dynamicDataSourceContext = new DynamicDataSourceContext();
|
if (CollUtil.isNotEmpty(slaves)) {
|
||||||
dynamicDataSourceContext.freshDataSource(targetDataSource);
|
for (int i = 0; i < slaves.size(); i++) {
|
||||||
return dynamicDataSourceContext;
|
SlaveInfo slave = slaves.get(i);
|
||||||
|
if (slave.getIsUse()) {
|
||||||
|
addDataSourceToMap(DynamicDatasourceConstant.DEFAULT_SLAVE_DATASOURCE_PREFIX + i, buildDataSource(slave.getDriver(), slave.getUrl(), slave.getUsername(), slave.getPassword(), slave.getPool()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dataSource.freshDataSource(DATA_SOURCE_MAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private static Object buildDataSource(String driver, String url, String username, String password, PoolInfo poolInfo) {
|
||||||
* 构建初始化数据源 TODO 生成中去其他地方获取初始化数据源(例如:表里面获取)
|
boolean flag = JdbcUtil.checkConnect(driver, url, username, password);
|
||||||
*
|
if (!flag) {
|
||||||
* @return
|
log.error("数据源: " + url + " , 连接失败,请检查!");
|
||||||
*/
|
return null;
|
||||||
public static Map<Object, Object> getDataSource() {
|
}
|
||||||
|
|
||||||
DynamicDataSource ds2 = new DynamicDataSource();
|
|
||||||
ds2.setTenantCode("1");
|
|
||||||
ds2.setDriver("com.mysql.cj.jdbc.Driver");
|
|
||||||
ds2.setUrl("jdbc:mysql://121.5.136.69:3306/qiaoba-boot?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai");
|
|
||||||
ds2.setUsername("root");
|
|
||||||
ds2.setPassword("LpYN7LUoL?l0OSpR2");
|
|
||||||
|
|
||||||
DynamicDataSource ds1 = new DynamicDataSource();
|
|
||||||
ds1.setTenantCode("2");
|
|
||||||
ds1.setDriver("com.mysql.cj.jdbc.Driver");
|
|
||||||
ds1.setUrl("jdbc:mysql://120.79.217.22:3306/qiaoba-boot?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai");
|
|
||||||
ds1.setUsername("root");
|
|
||||||
ds1.setPassword("FeyZ7xZr6JtuKibm");
|
|
||||||
Map<Object, Object> map = new HashMap<>();
|
|
||||||
map.put(ds1.getTenantCode(), buildDataSource(ds1));
|
|
||||||
map.put(ds2.getTenantCode(), buildDataSource(ds2));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 把数据源对象组装成HikariDataSource
|
|
||||||
*
|
|
||||||
* @param DynamicDataSource
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private static Object buildDataSource(DynamicDataSource DynamicDataSource) {
|
|
||||||
DruidDataSource dataSource = new DruidDataSource();
|
DruidDataSource dataSource = new DruidDataSource();
|
||||||
dataSource.setUrl(DynamicDataSource.getUrl());
|
dataSource.setUrl(url);
|
||||||
dataSource.setUsername(DynamicDataSource.getUsername());
|
dataSource.setUsername(username);
|
||||||
dataSource.setPassword(DynamicDataSource.getPassword());
|
dataSource.setPassword(password);
|
||||||
dataSource.setDriverClassName(DynamicDataSource.getDriver());
|
dataSource.setDriverClassName(driver);
|
||||||
dataSource.setInitialSize(5);
|
dataSource.setInitialSize(poolInfo.getInit());
|
||||||
dataSource.setMinIdle(10);
|
dataSource.setMinIdle(poolInfo.getMin());
|
||||||
dataSource.setMaxActive(20);
|
dataSource.setMaxActive(poolInfo.getMax());
|
||||||
try {
|
try {
|
||||||
dataSource.init();
|
dataSource.init();
|
||||||
|
return dataSource;
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
dataSource.close();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addDataSourceToMap(String name, Object dataSource) {
|
||||||
|
if (Objects.nonNull(dataSource)) {
|
||||||
|
DATA_SOURCE_MAP.put(name, dataSource);
|
||||||
}
|
}
|
||||||
return dataSource;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.qiaoba.common.database.config;
|
package com.qiaoba.common.database.config;
|
||||||
|
|
||||||
|
import com.qiaoba.common.database.constants.DynamicDatasourceConstant;
|
||||||
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -16,12 +17,13 @@ public class DynamicDataSourceContext extends AbstractRoutingDataSource {
|
|||||||
|
|
||||||
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置默认数据源、全部数据源,及刷新
|
* 设置默认数据源、全部数据源,及刷新
|
||||||
*/
|
*/
|
||||||
public void freshDataSource(Map<Object, Object> targetDataSources) {
|
public void freshDataSource(Map<Object, Object> targetDataSources) {
|
||||||
//默认数据源
|
//默认数据源
|
||||||
super.setDefaultTargetDataSource(targetDataSources.get("master"));
|
super.setDefaultTargetDataSource(targetDataSources.get(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY));
|
||||||
//设置全部数据源
|
//设置全部数据源
|
||||||
super.setTargetDataSources(targetDataSources);
|
super.setTargetDataSources(targetDataSources);
|
||||||
//刷新(即把targetDataSources刷到resolvedDataSources中去,resolvedDataSources才是我们真正存放数据源的map)
|
//刷新(即把targetDataSources刷到resolvedDataSources中去,resolvedDataSources才是我们真正存放数据源的map)
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.qiaoba.common.database.constants;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DynamicDatasourceConstant
|
||||||
|
*
|
||||||
|
* @author ailanyin
|
||||||
|
* @version 1.0
|
||||||
|
* @since 2023-04-27 19:35:28
|
||||||
|
*/
|
||||||
|
public class DynamicDatasourceConstant {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统默认的主数据源名称
|
||||||
|
*/
|
||||||
|
public static final String DEFAULT_MASTER_DATASOURCE_KEY = "master_default";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统默认的从数据源名称
|
||||||
|
*/
|
||||||
|
public static final String DEFAULT_SLAVE_DATASOURCE_PREFIX = "slave_default_";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主数据源拼接前缀 master_tenantId
|
||||||
|
*/
|
||||||
|
public static final String MASTER_PREFIX = "master_";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从数据源拼接前缀 slave_tenantId_序号
|
||||||
|
*/
|
||||||
|
public static final String SLAVE_PREFIX = "slave_";
|
||||||
|
|
||||||
|
}
|
@ -2,32 +2,38 @@ package com.qiaoba.common.database.factories;
|
|||||||
|
|
||||||
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
|
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
|
||||||
import com.qiaoba.common.database.config.DynamicDataSourceContext;
|
import com.qiaoba.common.database.config.DynamicDataSourceContext;
|
||||||
|
import com.qiaoba.common.database.filters.DynamicDataSourceFilter;
|
||||||
|
import com.qiaoba.common.database.properties.DefaultDataSourceProperties;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Primary;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 动态数据源的工厂,主要解决缓存依赖
|
* 动态数据源工厂
|
||||||
*
|
*
|
||||||
* @version 1.0
|
|
||||||
* @author ailanyin
|
* @author ailanyin
|
||||||
* @since 2023-04-25 21:47:34
|
* @version 1.0
|
||||||
|
* @since 2021/10/15 0015 下午 16:43
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
public class DynamicDataSourceFactory {
|
public class DynamicDataSourceFactory {
|
||||||
|
|
||||||
/**
|
|
||||||
* 把DynamicDataSourceContext 纳入容器管理,其他地方使用DynamicDataSourceConfig 类可以直接从容器取对象,并调用freshDataSource方法
|
|
||||||
*/
|
|
||||||
@Bean
|
@Bean
|
||||||
@Primary
|
public DynamicDataSourceContext dataSource() {
|
||||||
public static DynamicDataSourceContext dataSource() {
|
return new DynamicDataSourceContext();
|
||||||
Map<Object, Object> targetDataSource = DynamicDataSourceConfig.getDataSource();
|
}
|
||||||
//把DynamicDataSourceContext纳入容器管理
|
|
||||||
DynamicDataSourceContext dynamicDataSourceContext = new DynamicDataSourceContext();
|
@Bean
|
||||||
dynamicDataSourceContext.freshDataSource(targetDataSource);
|
public DynamicDataSourceConfig dynamicDataSourceConfig() {
|
||||||
return dynamicDataSourceContext;
|
return new DynamicDataSourceConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public DynamicDataSourceFilter handleTenantFilter() {
|
||||||
|
return new DynamicDataSourceFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public DefaultDataSourceProperties defaultDataSourceProperties() {
|
||||||
|
return new DefaultDataSourceProperties();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
package com.qiaoba.common.database.filters;
|
package com.qiaoba.common.database.filters;
|
||||||
|
|
||||||
import com.qiaoba.common.database.config.DynamicDataSourceContext;
|
import com.qiaoba.common.database.config.DynamicDataSourceContext;
|
||||||
|
import com.qiaoba.common.web.utils.ResponseUtil;
|
||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.*;
|
import javax.servlet.*;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -18,7 +20,7 @@ import java.io.IOException;
|
|||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
@Order(-10000)
|
@Order(-10000)
|
||||||
public class HandleTenantFilter implements Filter {
|
public class DynamicDataSourceFilter implements Filter {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private DynamicDataSourceContext dynamicDataSourceContext;
|
private DynamicDataSourceContext dynamicDataSourceContext;
|
||||||
@ -26,11 +28,21 @@ public class HandleTenantFilter implements Filter {
|
|||||||
@Override
|
@Override
|
||||||
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||||
HttpServletRequest request = (HttpServletRequest) servletRequest;
|
HttpServletRequest request = (HttpServletRequest) servletRequest;
|
||||||
String instanceId = request.getParameter("tenant");
|
String tenantCode = request.getParameter("tenant");
|
||||||
|
if (!checkTenantInfo(tenantCode, servletResponse)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
//设置当前租户对应的数据库
|
//设置当前租户对应的数据库
|
||||||
dynamicDataSourceContext.setDataSource(instanceId);
|
dynamicDataSourceContext.setDataSource(tenantCode);
|
||||||
System.out.println("当前数据源是:" + dynamicDataSourceContext.getDataSource());
|
System.out.println("当前数据源是:" + dynamicDataSourceContext.getDataSource());
|
||||||
filterChain.doFilter(servletRequest, servletResponse);
|
filterChain.doFilter(servletRequest, servletResponse);
|
||||||
dynamicDataSourceContext.clearDataSource();
|
dynamicDataSourceContext.clearDataSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean checkTenantInfo(String tenantCode, ServletResponse servletResponse) throws IOException {
|
||||||
|
// 检查租户的信息,是否存在,是否过期,是否禁用
|
||||||
|
ResponseUtil.response((HttpServletResponse) servletResponse, "租户: " + tenantCode + "已到期");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.qiaoba.common.database.properties;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@ConfigurationProperties(prefix = "qiaoba.datasource")
|
||||||
|
@Data
|
||||||
|
@EnableConfigurationProperties
|
||||||
|
public class DefaultDataSourceProperties {
|
||||||
|
|
||||||
|
private MasterInfo master;
|
||||||
|
|
||||||
|
private List<SlaveInfo> slaves;
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.qiaoba.common.database.properties;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class MasterInfo {
|
||||||
|
private String driver;
|
||||||
|
private String url;
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
private PoolInfo pool;
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.qiaoba.common.database.properties;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class PoolInfo {
|
||||||
|
private Integer init;
|
||||||
|
private Integer min;
|
||||||
|
private Integer max;
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.qiaoba.common.database.properties;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class SlaveInfo {
|
||||||
|
private Boolean isUse = true;
|
||||||
|
private String driver;
|
||||||
|
private String url;
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
private Integer weight = 1;
|
||||||
|
private PoolInfo pool;
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package com.qiaoba.common.database.utils;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JdbcUtil
|
||||||
|
*
|
||||||
|
* @author ailanyin
|
||||||
|
* @version 1.0
|
||||||
|
* @since 2021/10/15 0015 下午 16:43
|
||||||
|
*/
|
||||||
|
public class JdbcUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查数据源是否可以连接
|
||||||
|
*
|
||||||
|
* @param driver 数据库驱动
|
||||||
|
* @param url url
|
||||||
|
* @param username 用户名
|
||||||
|
* @param password 密码
|
||||||
|
* @return true = 是
|
||||||
|
*/
|
||||||
|
public static boolean checkConnect(String driver, String url, String username, String password) {
|
||||||
|
Connection conn = null;
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
Class.forName(driver);
|
||||||
|
//建立连接
|
||||||
|
conn = DriverManager.getConnection(url, username, password);
|
||||||
|
return true;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
if (conn != null) {
|
||||||
|
try {
|
||||||
|
conn.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,108 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource",
|
||||||
|
"type": "com.qiaoba.common.database.properties.DefaultDataSourceProperties",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.master",
|
||||||
|
"type": "com.qiaoba.common.database.properties.MasterInfo",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.master.driver",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.master.url",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.master.username",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.master.password",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.master.pool",
|
||||||
|
"type": "com.qiaoba.common.database.properties.PoolInfo",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.master.pool.init",
|
||||||
|
"type": "java.lang.Integer",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.master.pool.min",
|
||||||
|
"type": "java.lang.Integer",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.master.pool.max",
|
||||||
|
"type": "java.lang.Integer",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves",
|
||||||
|
"type": "java.util.List<com.qiaoba.common.database.properties.SlaveInfo>",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves.url",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves.username",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves.password",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves.weight",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves.is-use",
|
||||||
|
"type": "java.lang.Boolean",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties",
|
||||||
|
"defaultValue": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves.pool",
|
||||||
|
"type": "com.qiaoba.common.database.properties.PoolInfo",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves.pool.init",
|
||||||
|
"type": "java.lang.Integer",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves.pool.min",
|
||||||
|
"type": "java.lang.Integer",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qiaoba.datasource.slaves.pool.max",
|
||||||
|
"type": "java.lang.Integer",
|
||||||
|
"sourceType": "com.qiaoba.common.database.properties.DefaultDataSourceProperties"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hints": []
|
||||||
|
}
|
@ -1,5 +1,4 @@
|
|||||||
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||||
com.qiaoba.common.database.config.DynamicDataSourceConfig,\
|
com.qiaoba.common.database.factories.DynamicDataSourceFactory
|
||||||
com.qiaoba.common.database.filters.HandleTenantFilter
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.qiaoba.common.web.utils;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ResponseUtil
|
||||||
|
*
|
||||||
|
* @author ailanyin
|
||||||
|
* @version 1.0
|
||||||
|
* @since 2023-04-25 22:48:43
|
||||||
|
*/
|
||||||
|
public class ResponseUtil {
|
||||||
|
|
||||||
|
public static void response(HttpServletResponse response, String msg) throws IOException {
|
||||||
|
response.setStatus(HttpServletResponse.SC_OK);
|
||||||
|
response.setContentType("text/plain; charset=UTF-8");
|
||||||
|
response.getWriter().write(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user