", "");
- text = text.replaceAll("powered.*?shrek.wang", "");
- response.getWriter().write(text);
- }
- @Override
- public void destroy()
- {
- }
- };
- FilterRegistrationBean registrationBean = new FilterRegistrationBean();
- registrationBean.setFilter(filter);
- registrationBean.addUrlPatterns(commonJsPattern);
- return registrationBean;
- }
-}
diff --git a/maibu-framework/src/main/java/com/maibu/config/MyBatisConfig.java b/maibu-framework/src/main/java/com/maibu/config/MyBatisConfig.java
index 43139d8..3967b8b 100644
--- a/maibu-framework/src/main/java/com/maibu/config/MyBatisConfig.java
+++ b/maibu-framework/src/main/java/com/maibu/config/MyBatisConfig.java
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
-import com.maibu.datasource.DynamicDataSource;
import com.maibu.utils.StringUtils;
import org.apache.ibatis.io.VFS;
import org.apache.ibatis.session.SqlSessionFactory;
@@ -26,6 +25,7 @@ import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;
+import javax.sql.DataSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -128,7 +128,7 @@ public class MyBatisConfig
*/
@Bean(name = "mysqlSessionFactory")
@Primary
- public SqlSessionFactory sqlSessionFactory(DynamicDataSource dataSource) throws Exception
+ public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{
String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
diff --git a/maibu-framework/src/main/java/com/maibu/config/properties/DruidProperties.java b/maibu-framework/src/main/java/com/maibu/config/properties/DruidProperties.java
deleted file mode 100644
index ee9e961..0000000
--- a/maibu-framework/src/main/java/com/maibu/config/properties/DruidProperties.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.maibu.config.properties;
-
-import org.springframework.context.annotation.Configuration;
-
-/**
- * druid 配置属性
- *
- * @author ruoyi
- */
-@Configuration
-public class DruidProperties
-{
-// @Value("${spring.datasource.druid.initialSize}")
-// private int initialSize;
-//
-// @Value("${spring.datasource.druid.minIdle}")
-// private int minIdle;
-//
-// @Value("${spring.datasource.druid.maxActive}")
-// private int maxActive;
-//
-// @Value("${spring.datasource.druid.maxWait}")
-// private int maxWait;
-//
-// @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
-// private int timeBetweenEvictionRunsMillis;
-//
-// @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
-// private int minEvictableIdleTimeMillis;
-//
-// @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
-// private int maxEvictableIdleTimeMillis;
-//
-// @Value("${spring.datasource.druid.validationQuery}")
-// private String validationQuery;
-//
-// @Value("${spring.datasource.druid.testWhileIdle}")
-// private boolean testWhileIdle;
-//
-// @Value("${spring.datasource.druid.testOnBorrow}")
-// private boolean testOnBorrow;
-//
-// @Value("${spring.datasource.druid.testOnReturn}")
-// private boolean testOnReturn;
-
-// public DruidDataSource dataSource(DruidDataSource datasource)
-// {
-// /** 配置初始化大小、最小、最大 */
-// datasource.setInitialSize(initialSize);
-// datasource.setMaxActive(maxActive);
-// datasource.setMinIdle(minIdle);
-//
-// /** 配置获取连接等待超时的时间 */
-// datasource.setMaxWait(maxWait);
-//
-// /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
-// datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
-//
-// /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
-// datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
-// datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
-//
-// /**
-// * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
-// */
-// datasource.setValidationQuery(validationQuery);
-// /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
-// datasource.setTestWhileIdle(testWhileIdle);
-// /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
-// datasource.setTestOnBorrow(testOnBorrow);
-// /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
-// datasource.setTestOnReturn(testOnReturn);
-// return datasource;
-// }
-}
diff --git a/maibu-framework/src/main/java/com/maibu/config/sharding/ShardingAlgorithmTool.java b/maibu-framework/src/main/java/com/maibu/config/sharding/ShardingAlgorithmTool.java
deleted file mode 100644
index 522f137..0000000
--- a/maibu-framework/src/main/java/com/maibu/config/sharding/ShardingAlgorithmTool.java
+++ /dev/null
@@ -1,262 +0,0 @@
-package com.maibu.config.sharding;
-
-import cn.hutool.extra.spring.SpringUtil;
-import com.alibaba.druid.util.StringUtils;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.maibu.config.sharding.enums.ShardingTableCacheEnum;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource;
-import org.apache.shardingsphere.infra.config.RuleConfiguration;
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.sharding.algorithm.config.AlgorithmProvidedShardingRuleConfiguration;
-import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
-import org.springframework.core.env.Environment;
-
-import java.sql.*;
-import java.time.YearMonth;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @Title ShardingAlgorithmTool
- *
@Description 按月分片算法工具
- *
- */
-@Slf4j
-public class ShardingAlgorithmTool {
-
- /** 表分片符号,例:siot_device_log_202201 中,分片符号为 "_" */
- private static final String TABLE_SPLIT_SYMBOL = "_";
-
- /** 数据库配置 */
- private static final Environment ENV = SpringUtil.getApplicationContext().getEnvironment();
- private static final String DATASOURCE_URL = ENV.getProperty("spring.shardingsphere.datasource.ds0.url");
- private static final String DATASOURCE_USERNAME = ENV.getProperty("spring.shardingsphere.datasource.ds0.username");
- private static final String DATASOURCE_PASSWORD = ENV.getProperty("spring.shardingsphere.datasource.ds0.password");
-
-
- /**
- * 检查分表获取的表名是否存在,不存在则自动建表
- * @param logicTable 逻辑表
- * @param resultTableNames 真实表名,例:iot_device_log_202201
- * @return 存在于数据库中的真实表名集合
- */
- public static Set getShardingTablesAndCreate(ShardingTableCacheEnum logicTable, Collection resultTableNames) {
- return resultTableNames.stream().map(o -> getShardingTableAndCreate(logicTable, o)).collect(Collectors.toSet());
- }
-
- /**
- * 检查分表获取的表名是否存在,不存在则自动建表
- * @param logicTable 逻辑表
- * @param resultTableName 真实表名,例:iot_device_log_202201
- * @return 确认存在于数据库中的真实表名
- */
- public static String getShardingTableAndCreate(ShardingTableCacheEnum logicTable, String resultTableName) {
- // 缓存中有此表则返回,没有则判断创建
- if (logicTable.resultTableNamesCache().contains(resultTableName)) {
- return resultTableName;
- } else {
- // 未创建的表返回逻辑空表
- boolean isSuccess = createShardingTable(logicTable, resultTableName);
- return isSuccess ? resultTableName : logicTable.logicTableName();
- }
- }
-
- /**
- * 重载全部缓存
- */
- public static void tableNameCacheReloadAll() {
- Arrays.stream(ShardingTableCacheEnum.values()).forEach(ShardingAlgorithmTool::tableNameCacheReload);
- }
-
- /**
- * 重载指定分表缓存
- * @param logicTable 逻辑表
- */
- public static void tableNameCacheReload(ShardingTableCacheEnum logicTable) {
- // 读取数据库中所有表名
- List tableNameList = getAllTableNameBySchema(logicTable);
- // 更新缓存、配置(原子操作)
- logicTable.atomicUpdateCacheAndActualDataNodes(tableNameList);
- // 删除旧的缓存(如果存在)
- logicTable.resultTableNamesCache().clear();
- // 写入新的缓存
- logicTable.resultTableNamesCache().addAll(tableNameList);
- // 动态更新配置 actualDataNodes
- actualDataNodesRefresh(logicTable.logicTableName(), tableNameList);
- }
-
- /**
- * 获取所有表名
- * @return 表名集合
- * @param logicTable 逻辑表
- */
- public static List getAllTableNameBySchema(ShardingTableCacheEnum logicTable) {
- List tableNames = new ArrayList<>();
- if (StringUtils.isEmpty(DATASOURCE_URL) || StringUtils.isEmpty(DATASOURCE_USERNAME) || StringUtils.isEmpty(DATASOURCE_PASSWORD)) {
- log.error(">>>>>>>>>> 【ERROR】数据库连接配置有误,请稍后重试,URL:{}, username:{}, password:{}", DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD);
- throw new IllegalArgumentException("数据库连接配置有误,请稍后重试");
- }
- try (Connection conn = DriverManager.getConnection(DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD);
- Statement st = conn.createStatement()) {
- String logicTableName = logicTable.logicTableName();
- try (ResultSet rs = st.executeQuery("show TABLES like '" + logicTableName + TABLE_SPLIT_SYMBOL + "%'")) {
- log.info("查询数据库所有表:{}","show TABLES like '" + logicTableName + TABLE_SPLIT_SYMBOL + "%'");
- while (rs.next()) {
- String tableName = rs.getString(1);
- log.info("分表格式:{}",String.format("^(%s\\d{6})$", logicTableName + TABLE_SPLIT_SYMBOL));
- // 匹配分表格式 例:^(t\_contract_\d{6})$
- if (org.apache.commons.lang3.StringUtils.isNotBlank(tableName) && tableName.matches(String.format("^(%s\\d{6})$", logicTableName + TABLE_SPLIT_SYMBOL))) {
- tableNames.add(rs.getString(1));
- }
- }
- }
- } catch (SQLException e) {
- log.error(">>>>>>>>>> 【ERROR】数据库连接失败,请稍后重试,原因:{}", e.getMessage(), e);
- throw new IllegalArgumentException("数据库连接失败,请稍后重试");
- }
- return tableNames;
- }
-
- /**
- * 动态更新配置 actualDataNodes
- *
- * @param logicTableName 逻辑表名
- * @param tableNamesCache 真实表名集合
- */
- public static void actualDataNodesRefresh(String logicTableName, List tableNamesCache) {
- try {
- if (CollectionUtils.isEmpty(tableNamesCache)) {
- return;
- }
- // 获取数据分片节点
- String dbName = "ds0";
- log.info(">>>>>>>>>> 【INFO】更新分表配置,logicTableName:{},tableNamesCache:{}", logicTableName, tableNamesCache);
-
- // generate actualDataNodes
- String newActualDataNodes = tableNamesCache.stream().map(o -> String.format("%s.%s", dbName, o)).collect(Collectors.joining(","));
- ShardingSphereDataSource shardingSphereDataSource = SpringUtil.getBean(ShardingSphereDataSource.class);
- updateShardRuleActualDataNodes(shardingSphereDataSource, logicTableName, newActualDataNodes);
- }catch (Exception e){
- log.error("初始化 动态表单失败,原因:{}", e.getMessage(), e);
- }
- }
-
-
- // --------------------------------------------------------------------------------------------------------------
- // 私有方法
- // --------------------------------------------------------------------------------------------------------------
-
-
- /**
- * 刷新ActualDataNodes
- */
- private static void updateShardRuleActualDataNodes(ShardingSphereDataSource dataSource, String logicTableName, String newActualDataNodes) {
- // Context manager.
- ContextManager contextManager = dataSource.getContextManager();
-
- // Rule configuration.
- String schemaName = "logic_db";
- Collection newRuleConfigList = new LinkedList<>();
- Collection oldRuleConfigList = dataSource.getContextManager()
- .getMetaDataContexts()
- .getMetaData(schemaName)
- .getRuleMetaData()
- .getConfigurations();
-
- for (RuleConfiguration oldRuleConfig : oldRuleConfigList) {
- if (oldRuleConfig instanceof AlgorithmProvidedShardingRuleConfiguration) {
-
- // Algorithm provided sharding rule configuration
- AlgorithmProvidedShardingRuleConfiguration oldAlgorithmConfig = (AlgorithmProvidedShardingRuleConfiguration) oldRuleConfig;
- AlgorithmProvidedShardingRuleConfiguration newAlgorithmConfig = new AlgorithmProvidedShardingRuleConfiguration();
-
- // Sharding table rule configuration Collection
- Collection newTableRuleConfigList = new LinkedList<>();
- Collection oldTableRuleConfigList = oldAlgorithmConfig.getTables();
-
- oldTableRuleConfigList.forEach(oldTableRuleConfig -> {
- if (logicTableName.equals(oldTableRuleConfig.getLogicTable())) {
- ShardingTableRuleConfiguration newTableRuleConfig = new ShardingTableRuleConfiguration(oldTableRuleConfig.getLogicTable(), newActualDataNodes);
- newTableRuleConfig.setTableShardingStrategy(oldTableRuleConfig.getTableShardingStrategy());
- newTableRuleConfig.setDatabaseShardingStrategy(oldTableRuleConfig.getDatabaseShardingStrategy());
- newTableRuleConfig.setKeyGenerateStrategy(oldTableRuleConfig.getKeyGenerateStrategy());
-
- newTableRuleConfigList.add(newTableRuleConfig);
- } else {
- newTableRuleConfigList.add(oldTableRuleConfig);
- }
- });
-
- newAlgorithmConfig.setTables(newTableRuleConfigList);
- newAlgorithmConfig.setAutoTables(oldAlgorithmConfig.getAutoTables());
- newAlgorithmConfig.setBindingTableGroups(oldAlgorithmConfig.getBindingTableGroups());
- newAlgorithmConfig.setBroadcastTables(oldAlgorithmConfig.getBroadcastTables());
- newAlgorithmConfig.setDefaultDatabaseShardingStrategy(oldAlgorithmConfig.getDefaultDatabaseShardingStrategy());
- newAlgorithmConfig.setDefaultTableShardingStrategy(oldAlgorithmConfig.getDefaultTableShardingStrategy());
- newAlgorithmConfig.setDefaultKeyGenerateStrategy(oldAlgorithmConfig.getDefaultKeyGenerateStrategy());
- newAlgorithmConfig.setDefaultShardingColumn(oldAlgorithmConfig.getDefaultShardingColumn());
- newAlgorithmConfig.setShardingAlgorithms(oldAlgorithmConfig.getShardingAlgorithms());
- newAlgorithmConfig.setKeyGenerators(oldAlgorithmConfig.getKeyGenerators());
- newRuleConfigList.add(newAlgorithmConfig);
- }
- }
-
- // update context
- contextManager.alterRuleConfiguration(schemaName, newRuleConfigList);
- }
-
- /**
- * 创建分表
- * @param logicTable 逻辑表
- * @param resultTableName 真实表名,例:sys_user_behavior_202201
- * @return 创建结果(true创建成功,false未创建)
- */
- private static boolean createShardingTable(ShardingTableCacheEnum logicTable, String resultTableName) {
- // 根据日期判断,当前月份之后分表不提前创建
- String month = resultTableName.replace(logicTable.logicTableName() + TABLE_SPLIT_SYMBOL,"");
- YearMonth shardingMonth = YearMonth.parse(month, DateTimeFormatter.ofPattern("yyyyMM"));
- if (shardingMonth.isAfter(YearMonth.now())) {
- return false;
- }
-
- synchronized (logicTable.logicTableName().intern()) {
- // 缓存中有此表 返回
- if (logicTable.resultTableNamesCache().contains(resultTableName)) {
- return false;
- }
- // 缓存中无此表,则建表并添加缓存
- executeSql(Collections.singletonList("CREATE TABLE IF NOT EXISTS `" + resultTableName + "` LIKE `" + logicTable.logicTableName() + "`;"));
- // 缓存重载
- tableNameCacheReload(logicTable);
- }
- return true;
- }
-
- /**
- * 执行SQL
- * @param sqlList SQL集合
- */
- private static void executeSql(List sqlList) {
- if (StringUtils.isEmpty(DATASOURCE_URL) || StringUtils.isEmpty(DATASOURCE_USERNAME) || StringUtils.isEmpty(DATASOURCE_PASSWORD)) {
- log.error(">>>>>>>>>> 【ERROR】数据库连接配置有误,请稍后重试,URL:{}, username:{}, password:{}", DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD);
- throw new IllegalArgumentException("数据库连接配置有误,请稍后重试");
- }
- try (Connection conn = DriverManager.getConnection(DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD)) {
- try (Statement st = conn.createStatement()) {
- conn.setAutoCommit(false);
- for (String sql : sqlList) {
- st.execute(sql);
- }
- } catch (Exception e) {
- conn.rollback();
- log.error(">>>>>>>>>> 【ERROR】数据表创建执行失败,请稍后重试,原因:{}", e.getMessage(), e);
- throw new IllegalArgumentException("数据表创建执行失败,请稍后重试");
- }
- } catch (SQLException e) {
- log.error(">>>>>>>>>> 【ERROR】数据库连接失败,请稍后重试,原因:{}", e.getMessage(), e);
- throw new IllegalArgumentException("数据库连接失败,请稍后重试");
- }
- }
-}
diff --git a/maibu-framework/src/main/java/com/maibu/config/sharding/ShardingTablesLoadRunner.java b/maibu-framework/src/main/java/com/maibu/config/sharding/ShardingTablesLoadRunner.java
deleted file mode 100644
index 6c65231..0000000
--- a/maibu-framework/src/main/java/com/maibu/config/sharding/ShardingTablesLoadRunner.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.maibu.config.sharding;
-
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-/**
- * @Title ShardingTablesLoadRunner
- *
@Description 项目启动后,读取已有分表,进行缓存
- *
- */
-@Order(value = 1) // 数字越小,越先执行
-@Component
-public class ShardingTablesLoadRunner implements CommandLineRunner {
-
- @Override
- public void run(String... args) {
- // 读取已有分表,进行缓存
- //ShardingAlgorithmTool.tableNameCacheReloadAll();
- }
-}
diff --git a/maibu-framework/src/main/java/com/maibu/config/sharding/TimeShardingAlgorithm.java b/maibu-framework/src/main/java/com/maibu/config/sharding/TimeShardingAlgorithm.java
deleted file mode 100644
index 243fab8..0000000
--- a/maibu-framework/src/main/java/com/maibu/config/sharding/TimeShardingAlgorithm.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package com.maibu.config.sharding;
-
-import com.google.common.collect.Range;
-import com.maibu.config.sharding.enums.ShardingTableCacheEnum;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
-import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
-import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
-import org.springframework.util.CollectionUtils;
-
-import java.text.SimpleDateFormat;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-import java.util.function.Function;
-
-/**
- *
@Title TimeShardingAlgorithm
- *
@Description 分片算法,按月分片
- *
- */
-@Slf4j
-public class TimeShardingAlgorithm implements StandardShardingAlgorithm {
- /**
- * Date类型的分片时间格式
- */
- private static final SimpleDateFormat TABLE_SHARD_Date_FORMATTER = new SimpleDateFormat("yyyyMM");
-
- /**
- * 分片时间格式
- */
- private static final DateTimeFormatter TABLE_SHARD_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM");
-
- /**
- * 完整时间格式
- */
- private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
- /**
- * 完整时间格式
- */
- private static final SimpleDateFormat DATE_TIME_FORMATTER_SPILE = new SimpleDateFormat("yyyy-MM-dd");
-
- /**
- * 表分片符号,例:t_user_202201 中,分片符号为 "_"
- */
- private final String TABLE_SPLIT_SYMBOL = "_";
-
-
- /**
- * 精准分片
- * @param tableNames 对应分片库中所有分片表的集合
- * @param preciseShardingValue 分片键值,其中 logicTableName 为逻辑表,columnName 分片键,value 为从 SQL 中解析出来的分片键的值
- * @return 表名
- */
- @Override
- public String doSharding(Collection tableNames, PreciseShardingValue preciseShardingValue) {
- String logicTableName = preciseShardingValue.getLogicTableName();
- ShardingTableCacheEnum logicTable = ShardingTableCacheEnum.of(logicTableName);
- createAllTable(logicTable, tableNames);
-
- /// 打印分片信息
- log.info(">>>>>>>>>> 【INFO】精确分片,节点配置表名:{},数据库缓存表名:{}", tableNames, logicTable.resultTableNamesCache());
-
- Date date = preciseShardingValue.getValue();
- Instant instant = date.toInstant();
- LocalDateTime localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
- String resultTableName = logicTableName + "_" + TABLE_SHARD_TIME_FORMATTER.format(localDateTime);
- // 检查分表获取的表名是否存在,不存在则自动建表
- if (!tableNames.contains(resultTableName)){
- tableNames.add(resultTableName);
- }
- return ShardingAlgorithmTool.getShardingTableAndCreate(logicTable, resultTableName);
- }
-
- /**
- * 范围分片
- * @param tableNames 对应分片库中所有分片表的集合
- * @param rangeShardingValue 分片范围
- * @return 表名集合
- */
- @Override
- public Collection doSharding(Collection tableNames, RangeShardingValue rangeShardingValue) {
- log.info("开始分表查询开始:{}",System.currentTimeMillis());
- String logicTableName = rangeShardingValue.getLogicTableName();
- ShardingTableCacheEnum logicTable = ShardingTableCacheEnum.of(logicTableName);
- createAllTable(logicTable, tableNames);
-
- /// 打印分片信息
- log.info(">>>>>>>>>> 【INFO】范围分片,节点配置表名:{},数据库缓存表名:{}", tableNames, logicTable.resultTableNamesCache());
-
- // between and 的起始值
- Range valueRange = rangeShardingValue.getValueRange();
- boolean hasLowerBound = valueRange.hasLowerBound();
- boolean hasUpperBound = valueRange.hasUpperBound();
-
- // 获取最大值和最小值
- Set tableNameCache = logicTable.resultTableNamesCache();
- String min = hasLowerBound ? String.valueOf(valueRange.lowerEndpoint()) : getLowerEndpoint(tableNameCache);
- String max = hasUpperBound ? String.valueOf(valueRange.upperEndpoint()) : getUpperEndpoint(tableNameCache);
- // 循环计算分表范围
- Set resultTableNames = new LinkedHashSet<>();
- try {
- Date minDate = DATE_TIME_FORMATTER_SPILE.parse(min);
- Date maxDate = DATE_TIME_FORMATTER_SPILE.parse(max);
- Calendar calendar = Calendar.getInstance();
- while (minDate.before(maxDate) || minDate.equals(maxDate)) {
- String tableName = logicTableName + TABLE_SPLIT_SYMBOL + TABLE_SHARD_Date_FORMATTER.format(minDate);
- resultTableNames.add(tableName);
- calendar.setTime(minDate); // 设置Calendar的时间为Date对象的时间
- calendar.add(Calendar.DAY_OF_MONTH, 1); // 给日期加一天
- minDate = calendar.getTime();
- }
- log.info("开始分表查询结束:{}",System.currentTimeMillis());
- return ShardingAlgorithmTool.getShardingTablesAndCreate(logicTable, resultTableNames);
- } catch (Exception e) {
- return ShardingAlgorithmTool.getShardingTablesAndCreate(logicTable, logicTable.resultTableNamesCache());
- }
- }
-
-
- @Override
- public void init() {
-
- }
-
- @Override
- public String getType() {
- return null;
- }
-
- // --------------------------------------------------------------------------------------------------------------
- // 私有方法
- // --------------------------------------------------------------------------------------------------------------
-
- /**
- * 获取 最小分片值
- * @param tableNames 表名集合
- * @return 最小分片值
- */
- private String getLowerEndpoint(Collection tableNames) {
- Optional optional = tableNames.stream()
- .map(o -> LocalDateTime.parse(o.replace(TABLE_SPLIT_SYMBOL, "") + "01 00:00:00", DATE_TIME_FORMATTER))
- .min(Comparator.comparing(Function.identity()));
- if (optional.isPresent()) {
- ZonedDateTime zonedDateTime = optional.get().atZone(ZoneId.systemDefault());
- Instant instant = zonedDateTime.toInstant();
- return String.valueOf(Date.from(instant));
- } else {
- log.error(">>>>>>>>>> 【ERROR】获取数据最小分表失败,请稍后重试,tableName:{}", tableNames);
- throw new IllegalArgumentException("获取数据最小分表失败,请稍后重试");
- }
- }
-
- /**
- * 获取 最大分片值
- * @param tableNames 表名集合
- * @return 最大分片值
- */
- private String getUpperEndpoint(Collection tableNames) {
- Optional optional = tableNames.stream()
- .map(o -> LocalDateTime.parse(o.replace(TABLE_SPLIT_SYMBOL, "") + "01 00:00:00", DATE_TIME_FORMATTER))
- .max(Comparator.comparing(Function.identity()));
- if (optional.isPresent()) {
- ZonedDateTime zonedDateTime = optional.get().atZone(ZoneId.systemDefault());
- Instant instant = zonedDateTime.toInstant();
- return String.valueOf(Date.from(instant));
- } else {
- log.error(">>>>>>>>>> 【ERROR】获取数据最大分表失败,请稍后重试,tableName:{}", tableNames);
- throw new IllegalArgumentException("获取数据最大分表失败,请稍后重试");
- }
- }
-
- /**
- * 根据分片规则获取的表,创建所有的表
- * @param logicTable
- * @param tableNames
- */
- private void createAllTable(ShardingTableCacheEnum logicTable, Collection tableNames) {
- if (!CollectionUtils.isEmpty(logicTable.resultTableNamesCache())) {
- //如果缓存中有表了,则证明已经创建了表,无需再创建
- return;
- }
- //根据分片规则创建表
- ShardingAlgorithmTool.getShardingTablesAndCreate(logicTable,tableNames);
- //刷新缓存
- ShardingAlgorithmTool.tableNameCacheReload(logicTable);
- }
-}
diff --git a/maibu-framework/src/main/java/com/maibu/config/sharding/enums/ShardingTableCacheEnum.java b/maibu-framework/src/main/java/com/maibu/config/sharding/enums/ShardingTableCacheEnum.java
deleted file mode 100644
index 70e7683..0000000
--- a/maibu-framework/src/main/java/com/maibu/config/sharding/enums/ShardingTableCacheEnum.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.maibu.config.sharding.enums;
-
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import java.util.*;
-
-import static com.maibu.config.sharding.ShardingAlgorithmTool.actualDataNodesRefresh;
-
-
-/**
- * @Title ShardingTableCacheEnum
- *
@Description 分片表缓存枚举
- *
- */
-public enum ShardingTableCacheEnum {
-
- /**
- * 用户埋点表
- */
- DEVICE_LOG("iot_device_log", new HashSet<>());
-
- /**
- * 逻辑表名
- */
- private final String logicTableName;
- /**
- * 实际表名
- */
- private final Set resultTableNamesCache;
-
- private static Map valueMap = new HashMap<>();
-
- static {
- Arrays.stream(ShardingTableCacheEnum.values()).forEach(o -> valueMap.put(o.logicTableName, o));
- }
-
- ShardingTableCacheEnum(String logicTableName, Set resultTableNamesCache) {
- this.logicTableName = logicTableName;
- this.resultTableNamesCache = resultTableNamesCache;
- }
-
- public static ShardingTableCacheEnum of(String value) {
- return valueMap.get(value);
- }
-
- public String logicTableName() {
- return logicTableName;
- }
-
- public Set resultTableNamesCache() {
- return resultTableNamesCache;
- }
-
- /**
- * 更新缓存、配置(原子操作)
- *
- * @param tableNameList
- */
- public void atomicUpdateCacheAndActualDataNodes(List tableNameList) {
- if (CollectionUtils.isEmpty(tableNameList)) {
- return;
- }
- synchronized (resultTableNamesCache) {
- // 删除缓存
- resultTableNamesCache.clear();
- // 写入新的缓存
- resultTableNamesCache.addAll(tableNameList);
- // 动态更新配置 actualDataNodes
- actualDataNodesRefresh(logicTableName, tableNameList);
- }
- }
-
- public static Set logicTableNames() {
- return valueMap.keySet();
- }
-
- @Override
- public String toString() {
- return "ShardingTableCacheEnum{" +
- "logicTableName='" + logicTableName + '\'' +
- ", resultTableNamesCache=" + resultTableNamesCache +
- '}';
- }
-}
diff --git a/maibu-framework/src/main/java/com/maibu/datasource/DynamicDataSource.java b/maibu-framework/src/main/java/com/maibu/datasource/DynamicDataSource.java
deleted file mode 100644
index ae408f3..0000000
--- a/maibu-framework/src/main/java/com/maibu/datasource/DynamicDataSource.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.maibu.datasource;
-
-import java.util.Map;
-import javax.sql.DataSource;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
-
-/**
- * 动态数据源
- *
- * @author ruoyi
- */
-@Slf4j
-public class DynamicDataSource extends AbstractRoutingDataSource
-{
- public DynamicDataSource(DataSource defaultTargetDataSource, Map