Pre Merge pull request !136 from 瞿佐鹏/master-jdk17-sharding-pr
commit
da319c03dc
165
pom.xml
165
pom.xml
|
@ -1,165 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao</artifactId>
|
||||
<version>${revision}</version>
|
||||
<packaging>pom</packaging>
|
||||
<modules>
|
||||
<module>yudao-dependencies</module>
|
||||
<module>yudao-gateway</module>
|
||||
<module>yudao-framework</module>
|
||||
<!-- 各种 module 拓展 -->
|
||||
<module>yudao-module-system</module>
|
||||
<module>yudao-module-infra</module>
|
||||
<module>yudao-module-member</module>
|
||||
<module>yudao-module-bpm</module>
|
||||
<module>yudao-module-pay</module>
|
||||
<module>yudao-module-report</module>
|
||||
<module>yudao-module-mp</module>
|
||||
<module>yudao-module-mall</module>
|
||||
<module>yudao-module-crm</module>
|
||||
<module>yudao-module-erp</module>
|
||||
<module>yudao-module-ai</module>
|
||||
</modules>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>芋道项目基础脚手架</description>
|
||||
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
|
||||
|
||||
<properties>
|
||||
<revision>2.2.0-snapshot</revision>
|
||||
<!-- Maven 相关 -->
|
||||
<java.version>17</java.version>
|
||||
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||
<maven-surefire-plugin.version>3.2.2</maven-surefire-plugin.version>
|
||||
<maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
|
||||
<flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
|
||||
<!-- 看看咋放到 bom 里 -->
|
||||
<lombok.version>1.18.34</lombok.version>
|
||||
<spring.boot.version>3.3.1</spring.boot.version>
|
||||
<mapstruct.version>1.5.5.Final</mapstruct.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-dependencies</artifactId>
|
||||
<version>${revision}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<build>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<!-- maven-surefire-plugin 插件,用于运行单元测试。 -->
|
||||
<!-- 注意,需要使用 3.0.X+,因为要支持 Junit 5 版本 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>${maven-surefire-plugin.version}</version>
|
||||
</plugin>
|
||||
<!-- maven-compiler-plugin 插件,解决 Lombok + MapStruct 组合 -->
|
||||
<!-- https://stackoverflow.com/questions/33483697/re-run-spring-boot-configuration-annotation-processor-to-update-generated-metada -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>${maven-compiler-plugin.version}</version>
|
||||
<configuration>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||
<version>${spring.boot.version}</version>
|
||||
</path>
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
</path>
|
||||
<path>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct-processor</artifactId>
|
||||
<version>${mapstruct.version}</version>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
<!-- 编译参数写在 arg 内,解决 Spring Boot 3.2 的 Parameter Name Discovery 问题 -->
|
||||
<debug>false</debug>
|
||||
<compilerArgs>
|
||||
<arg>-parameters</arg>
|
||||
</compilerArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
|
||||
<plugins>
|
||||
<!-- 统一 revision 版本 -->
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>flatten-maven-plugin</artifactId>
|
||||
<version>${flatten-maven-plugin.version}</version>
|
||||
<configuration>
|
||||
<flattenMode>resolveCiFriendliesOnly</flattenMode>
|
||||
<updatePomFile>true</updatePomFile>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>flatten</goal>
|
||||
</goals>
|
||||
<id>flatten</id>
|
||||
<phase>process-resources</phase>
|
||||
</execution>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>clean</goal>
|
||||
</goals>
|
||||
<id>flatten.clean</id>
|
||||
<phase>clean</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<!-- 使用 huawei / aliyun 的 Maven 源,提升下载速度 -->
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>huaweicloud</id>
|
||||
<name>huawei</name>
|
||||
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>aliyunmaven</id>
|
||||
<name>aliyun</name>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>spring-milestones</id>
|
||||
<name>Spring Milestones</name>
|
||||
<url>https://repo.spring.io/milestone</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>spring-snapshots</id>
|
||||
<name>Spring Snapshots</name>
|
||||
<url>https://repo.spring.io/snapshot</url>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
</project>
|
|
@ -152,6 +152,13 @@
|
|||
<artifactId>hutool-extra</artifactId> <!-- 邮件 -->
|
||||
</dependency>
|
||||
|
||||
<!-- 分表 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
|
||||
<version>5.2.1</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
|
@ -6,9 +6,11 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|||
import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogPageReqDTO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
|
||||
import com.baomidou.dynamic.datasource.annotation.DS;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
@DS("sharding")
|
||||
public interface OperateLogMapper extends BaseMapperX<OperateLogDO> {
|
||||
|
||||
default PageResult<OperateLogDO> selectPage(OperateLogPageReqVO pageReqDTO) {
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
package cn.iocoder.yudao.module.system.framework.sharding;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||
import com.google.common.collect.Range;
|
||||
import lombok.Getter;
|
||||
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 java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* @Description
|
||||
* 目前分页查询是有点问题,不过我项目里没有用到没有研究那块,貌似是selectPage会执行mp的查询count,会报错
|
||||
*
|
||||
* @Date 2024/6/13 10:07
|
||||
* @Author tom
|
||||
**/
|
||||
@Getter
|
||||
@Slf4j
|
||||
public class DataPreciseShardingAlgorithm implements StandardShardingAlgorithm<LocalDateTime> {
|
||||
|
||||
@Override
|
||||
public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<LocalDateTime> rangeShardingValue) {
|
||||
Range<LocalDateTime> valueRange = rangeShardingValue.getValueRange();
|
||||
LocalDateTime lowerEndpoint = valueRange.lowerEndpoint();
|
||||
LocalDateTime upperEndpoint = valueRange.upperEndpoint();
|
||||
|
||||
// 逻辑表名
|
||||
String logicTableName = rangeShardingValue.getLogicTableName();
|
||||
List<String> tables = new ArrayList<>();
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
if (upperEndpoint.getYear() > now.getYear() || upperEndpoint.getMonthValue() > now.getMonthValue()) {
|
||||
log.warn("时间区间异常 不能查询未来数据 {} {}",lowerEndpoint,upperEndpoint);
|
||||
throw new ServiceException(40001,"不能查询未来数据");
|
||||
}
|
||||
while (lowerEndpoint.compareTo(upperEndpoint) <= 0) {
|
||||
// 添加到集合
|
||||
tables.add(buildTable(logicTableName, lowerEndpoint));
|
||||
// 往后加一个月
|
||||
lowerEndpoint = lowerEndpoint.plusMonths(1).withDayOfMonth(1);
|
||||
}
|
||||
return tables;
|
||||
}
|
||||
|
||||
private String buildTable(String logicTableName, LocalDateTime startTime) {
|
||||
String timeStr = DateUtil.formatLocalDateTime(startTime);
|
||||
String year = timeStr.substring(2, 4);
|
||||
String month = timeStr.substring(5, 7);
|
||||
|
||||
return logicTableName + "_" + year + month;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String doSharding(Collection<String> collection, PreciseShardingValue<LocalDateTime> preciseShardingValue) {
|
||||
String timeStr = DateUtil.formatLocalDateTime(preciseShardingValue.getValue());
|
||||
String year = timeStr.substring(2, 4);
|
||||
String month = timeStr.substring(5, 7);
|
||||
String tableSuffix = year + month;
|
||||
for (String s : collection) {
|
||||
if (s.contains(tableSuffix)){
|
||||
return s;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Properties getProps() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(Properties properties) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "HIS_DATA_SPI_BASED";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
package cn.iocoder.yudao.module.system.framework.sharding;
|
||||
|
||||
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
|
||||
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
|
||||
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
|
||||
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
|
||||
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Configuration
|
||||
public class MyDataSourceConfiguration {
|
||||
|
||||
@Resource
|
||||
private DynamicDataSourceProperties properties;
|
||||
|
||||
/**
|
||||
* 分片: shardingDataSource
|
||||
* 主从: masterSlaveDataSource
|
||||
* 根据自己场景修改注入
|
||||
*/
|
||||
// @Lazy
|
||||
// @Resource
|
||||
// private MasterSlaveDataSource masterSlaveDataSource;
|
||||
|
||||
// @Lazy
|
||||
@Resource
|
||||
private ShardingSphereDataSource shardingSphereDataSource;
|
||||
|
||||
@Bean
|
||||
public DynamicDataSourceProvider dynamicDataSourceProvider(DefaultDataSourceCreator dataSourceCreator) {
|
||||
return new AbstractDataSourceProvider(dataSourceCreator) {
|
||||
|
||||
@Override
|
||||
public Map<String, DataSource> loadDataSources() {
|
||||
Map<String, DataSource> dataSourceMap = new HashMap<>();
|
||||
dataSourceMap.put("sharding", shardingSphereDataSource);
|
||||
//下面的代码可以把 shardingJdbc 内部管理的子数据源也同时添加到动态数据源里 (根据自己需要选择开启+注解了@Lazy被代理了不可以)
|
||||
// Map<String, DataSource> shardingInnerDataSources = shardingSphereDataSource();
|
||||
// dataSourceMap.putAll(shardingInnerDataSources);
|
||||
return dataSourceMap;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 将动态数据源设置为首选的
|
||||
* 当spring存在多个数据源时, 自动注入的是首选的对象
|
||||
* 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
|
||||
* 3.4.0版本及以上使用以下方式注入,老版本请阅读文档 进阶-手动注入多数据源
|
||||
*/
|
||||
@Primary
|
||||
@Bean
|
||||
public DataSource dataSource(List<DynamicDataSourceProvider> providers) {
|
||||
DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource(providers);
|
||||
dataSource.setPrimary(properties.getPrimary());
|
||||
dataSource.setStrict(properties.getStrict());
|
||||
dataSource.setStrategy(properties.getStrategy());
|
||||
dataSource.setSeata(properties.getSeata());
|
||||
dataSource.setP6spy(properties.getP6spy());
|
||||
dataSource.setSeata(properties.getSeata());
|
||||
return dataSource;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,206 @@
|
|||
//
|
||||
// Source code recreated from a .class file by IntelliJ IDEA
|
||||
// (powered by FernFlower decompiler)
|
||||
//
|
||||
|
||||
package org.yaml.snakeyaml.representer;
|
||||
|
||||
import org.yaml.snakeyaml.DumperOptions;
|
||||
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
|
||||
import org.yaml.snakeyaml.TypeDescription;
|
||||
import org.yaml.snakeyaml.introspector.Property;
|
||||
import org.yaml.snakeyaml.introspector.PropertyUtils;
|
||||
import org.yaml.snakeyaml.nodes.*;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class Representer extends SafeRepresenter {
|
||||
protected Map<Class<? extends Object>, TypeDescription> typeDefinitions = Collections.emptyMap();
|
||||
|
||||
|
||||
public Representer() {
|
||||
super(new DumperOptions());
|
||||
this.representers.put(null, new RepresentJavaBean());
|
||||
}
|
||||
|
||||
public Representer(DumperOptions options) {
|
||||
super(options);
|
||||
this.representers.put(null, new RepresentJavaBean());
|
||||
}
|
||||
|
||||
public TypeDescription addTypeDescription(TypeDescription td) {
|
||||
if (Collections.EMPTY_MAP == this.typeDefinitions) {
|
||||
this.typeDefinitions = new HashMap();
|
||||
}
|
||||
|
||||
if (td.getTag() != null) {
|
||||
this.addClassTag(td.getType(), td.getTag());
|
||||
}
|
||||
|
||||
td.setPropertyUtils(this.getPropertyUtils());
|
||||
return (TypeDescription)this.typeDefinitions.put(td.getType(), td);
|
||||
}
|
||||
|
||||
public void setPropertyUtils(PropertyUtils propertyUtils) {
|
||||
super.setPropertyUtils(propertyUtils);
|
||||
Collection<TypeDescription> tds = this.typeDefinitions.values();
|
||||
Iterator var3 = tds.iterator();
|
||||
|
||||
while(var3.hasNext()) {
|
||||
TypeDescription typeDescription = (TypeDescription)var3.next();
|
||||
typeDescription.setPropertyUtils(propertyUtils);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected MappingNode representJavaBean(Set<Property> properties, Object javaBean) {
|
||||
List<NodeTuple> value = new ArrayList(properties.size());
|
||||
Tag customTag = (Tag)this.classTags.get(javaBean.getClass());
|
||||
Tag tag = customTag != null ? customTag : new Tag(javaBean.getClass());
|
||||
MappingNode node = new MappingNode(tag, value, FlowStyle.AUTO);
|
||||
this.representedObjects.put(javaBean, node);
|
||||
FlowStyle bestStyle = FlowStyle.FLOW;
|
||||
Iterator var8 = properties.iterator();
|
||||
|
||||
while(true) {
|
||||
NodeTuple tuple;
|
||||
do {
|
||||
if (!var8.hasNext()) {
|
||||
if (this.defaultFlowStyle != FlowStyle.AUTO) {
|
||||
node.setFlowStyle(this.defaultFlowStyle);
|
||||
} else {
|
||||
node.setFlowStyle(bestStyle);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
Property property = (Property)var8.next();
|
||||
Object memberValue = property.get(javaBean);
|
||||
Tag customPropertyTag = memberValue == null ? null : (Tag)this.classTags.get(memberValue.getClass());
|
||||
tuple = this.representJavaBeanProperty(javaBean, property, memberValue, customPropertyTag);
|
||||
} while(tuple == null);
|
||||
|
||||
if (!((ScalarNode)tuple.getKeyNode()).isPlain()) {
|
||||
bestStyle = FlowStyle.BLOCK;
|
||||
}
|
||||
|
||||
Node nodeValue = tuple.getValueNode();
|
||||
if (!(nodeValue instanceof ScalarNode) || !((ScalarNode)nodeValue).isPlain()) {
|
||||
bestStyle = FlowStyle.BLOCK;
|
||||
}
|
||||
|
||||
value.add(tuple);
|
||||
}
|
||||
}
|
||||
|
||||
protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, Tag customTag) {
|
||||
ScalarNode nodeKey = (ScalarNode)this.representData(property.getName());
|
||||
boolean hasAlias = this.representedObjects.containsKey(propertyValue);
|
||||
Node nodeValue = this.representData(propertyValue);
|
||||
if (propertyValue != null && !hasAlias) {
|
||||
NodeId nodeId = nodeValue.getNodeId();
|
||||
if (customTag == null) {
|
||||
if (nodeId == NodeId.scalar) {
|
||||
if (property.getType() != Enum.class && propertyValue instanceof Enum) {
|
||||
nodeValue.setTag(Tag.STR);
|
||||
}
|
||||
} else {
|
||||
if (nodeId == NodeId.mapping && property.getType() == propertyValue.getClass() && !(propertyValue instanceof Map) && !nodeValue.getTag().equals(Tag.SET)) {
|
||||
nodeValue.setTag(Tag.MAP);
|
||||
}
|
||||
|
||||
this.checkGlobalTag(property, nodeValue, propertyValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new NodeTuple(nodeKey, nodeValue);
|
||||
}
|
||||
|
||||
protected void checkGlobalTag(Property property, Node node, Object object) {
|
||||
if (!object.getClass().isArray() || !object.getClass().getComponentType().isPrimitive()) {
|
||||
Class<?>[] arguments = property.getActualTypeArguments();
|
||||
if (arguments != null) {
|
||||
Class t;
|
||||
Iterator iter;
|
||||
Iterator var9;
|
||||
if (node.getNodeId() == NodeId.sequence) {
|
||||
t = arguments[0];
|
||||
SequenceNode snode = (SequenceNode)node;
|
||||
Iterable<Object> memberList = Collections.emptyList();
|
||||
if (object.getClass().isArray()) {
|
||||
memberList = Arrays.asList((Object[])object);
|
||||
} else if (object instanceof Iterable) {
|
||||
memberList = (Iterable)object;
|
||||
}
|
||||
|
||||
iter = ((Iterable)memberList).iterator();
|
||||
if (iter.hasNext()) {
|
||||
var9 = snode.getValue().iterator();
|
||||
|
||||
while(var9.hasNext()) {
|
||||
Node childNode = (Node)var9.next();
|
||||
Object member = iter.next();
|
||||
if (member != null && t.equals(member.getClass()) && childNode.getNodeId() == NodeId.mapping) {
|
||||
childNode.setTag(Tag.MAP);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (object instanceof Set) {
|
||||
t = arguments[0];
|
||||
MappingNode mnode = (MappingNode)node;
|
||||
iter = mnode.getValue().iterator();
|
||||
Set<?> set = (Set)object;
|
||||
var9 = set.iterator();
|
||||
|
||||
while(var9.hasNext()) {
|
||||
Object member = var9.next();
|
||||
NodeTuple tuple = (NodeTuple)iter.next();
|
||||
Node keyNode = tuple.getKeyNode();
|
||||
if (t.equals(member.getClass()) && keyNode.getNodeId() == NodeId.mapping) {
|
||||
keyNode.setTag(Tag.MAP);
|
||||
}
|
||||
}
|
||||
} else if (object instanceof Map) {
|
||||
t = arguments[0];
|
||||
Class<?> valueType = arguments[1];
|
||||
MappingNode mnode = (MappingNode)node;
|
||||
iter = mnode.getValue().iterator();
|
||||
|
||||
while(iter.hasNext()) {
|
||||
NodeTuple tuple = (NodeTuple)iter.next();
|
||||
this.resetTag(t, tuple.getKeyNode());
|
||||
this.resetTag(valueType, tuple.getValueNode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void resetTag(Class<? extends Object> type, Node node) {
|
||||
Tag tag = node.getTag();
|
||||
if (tag.matches(type)) {
|
||||
if (Enum.class.isAssignableFrom(type)) {
|
||||
node.setTag(Tag.STR);
|
||||
} else {
|
||||
node.setTag(Tag.MAP);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected Set<Property> getProperties(Class<? extends Object> type) {
|
||||
return this.typeDefinitions.containsKey(type) ? ((TypeDescription)this.typeDefinitions.get(type)).getProperties() : this.getPropertyUtils().getProperties(type);
|
||||
}
|
||||
|
||||
protected class RepresentJavaBean implements Represent {
|
||||
protected RepresentJavaBean() {
|
||||
}
|
||||
|
||||
public Node representData(Object data) {
|
||||
return Representer.this.representJavaBean(Representer.this.getProperties(data.getClass()), data);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
cn.iocoder.yudao.module.system.framework.sharding.DataPreciseShardingAlgorithm
|
|
@ -73,7 +73,43 @@ spring:
|
|||
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
## sharding 配置
|
||||
shardingsphere:
|
||||
props:
|
||||
sql:
|
||||
show: true
|
||||
sql-show: true
|
||||
datasource:
|
||||
names: db-0
|
||||
db-0:
|
||||
type: com.alibaba.druid.pool.DruidDataSource
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
username: root
|
||||
password: 123456
|
||||
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8&rewriteBatchedStatements=true
|
||||
rules:
|
||||
sharding:
|
||||
tables:
|
||||
system_operate_log:
|
||||
key-generator:
|
||||
column: id
|
||||
type: SNOWFLAKE
|
||||
#分片策略
|
||||
actual-data-nodes: db-0.system_operate_log_${24..50}0${1..9},db-0.system_operate_log_${24..50}1${0..2}
|
||||
table-strategy: #表分片策略
|
||||
standard:
|
||||
sharding-column: create_time
|
||||
sharding-algorithm-name: his_month_sharding
|
||||
# 配置分片算法
|
||||
sharding-algorithms:
|
||||
# person_sync_record_inline:
|
||||
# type: INLINE
|
||||
# props:
|
||||
# algorithm-expression: person_sync_record_$->{id % 16}
|
||||
# 分片算法名称
|
||||
his_month_sharding:
|
||||
# 分片算法类型,这个type是我们的分片算法实现类中 getType()的返回值,SPI适用于这种方式
|
||||
type: HIS_DATA_SPI_BASED
|
||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||
data:
|
||||
redis:
|
||||
|
|
Loading…
Reference in New Issue