paulzhu8597 opened a new issue, #34124:
URL: https://github.com/apache/shardingsphere/issues/34124
Here is the code
ModeConfiguration modeConfig = createModeConfiguration();
Map<String, DataSource> dataSourceMap = createDataSourceMap();
Collection<RuleConfiguration> ruleConfigs =
Arrays.asList(createShardingRuleConfiguration()); // 构建具体规则
Properties props = new Properties();// 构建属性配置
DataSource result =
ShardingSphereDataSourceFactory.createDataSource(modeConfig,dataSourceMap,
ruleConfigs, props);
return result;
private ModeConfiguration createModeConfiguration() {
return new ModeConfiguration("Standalone", new
StandalonePersistRepositoryConfiguration("JDBC", new Properties()));
}
private Map<String, DataSource> createDataSourceMap() {
Map<String, DataSource> result = new HashMap<String, DataSource>();
DataSource iopDataSource =
createDataSource(url0,username0,password0);
result.put("goods",iopDataSource);
DataSource SchoolDataSource =
createDataSource(url1,username1,password1);
result.put("school",SchoolDataSource);
}
private ShardingRuleConfiguration
createShardingRuleConfiguration() {
ShardingRuleConfiguration result = new ShardingRuleConfiguration();
// goods
result.getTables().add(getgoodsOrderTableRuleConfiguration());
result.getTables().add(getgoodsOrderItemTableRuleConfiguration());
// school
result.getTables().add(getSchoolOrderTableRuleConfiguration());
result.getTables().add(getSchoolOrderItemTableRuleConfiguration());
// 绑定关系
result.getBindingTableGroups().add(new
ShardingTableReferenceRuleConfiguration("goods", "orders"));
result.getBindingTableGroups().add(new
ShardingTableReferenceRuleConfiguration("school", "orders"));
Properties propsgoodsTables = new Properties();
propsgoodsTables.put("algorithm-expression",
"orders_$->{user_id.substring(user_id.length() - 1, user_id.length()).toLong()
% 2}");
result.getShardingAlgorithms().put("goods_tp_orders_inline", new
AlgorithmConfiguration("INLINE", propsgoodsTables));
Properties propsgoodsOrderDetailTable = new Properties();
propsgoodsOrderDetailTable.put("algorithm-expression",
"orders_detail_$->{orders_id.substring(orders_id.length() - 1,
orders_id.length()).toLong() % 2}");
result.getShardingAlgorithms().put("goods_tp_orders_detail_inline",
new AlgorithmConfiguration("INLINE", propsgoodsOrderDetailTable));
//school
// school orders 分片算法
Properties propsJtLableOrders = new Properties();
propsJtLableOrders.put("algorithm-expression",
"orders_$->{user_id.substring(user_id.length() - 1, user_id.length()).toLong()
% 2}");
result.getShardingAlgorithms().put("school_tp_orders_inline", new
AlgorithmConfiguration("INLINE", propsJtLableOrders));
// school orders_detail 分片算法
Properties propsSchoolOrderDetail = new Properties();
propsSchoolOrderDetail.put("algorithm-expression",
"orders_detail_$->{orders_id.substring(orders_id.length() - 1,
orders_id.length()).toLong() % 2}");
result.getShardingAlgorithms().put("school_tp_orders_detail_inline",
new AlgorithmConfiguration("INLINE", propsSchoolOrderDetail));
Properties dbShardingAlgorithmPro = new Properties();
dbShardingAlgorithmPro.put("algorithmClassName",
"com.ciwei.config.CustomDataBaseShardingAlgorithm");
dbShardingAlgorithmPro.put("strategy","standard");
result.getShardingAlgorithms().put("goods_db_orders_inline",new
AlgorithmConfiguration("CLASS_BASED", dbShardingAlgorithmPro));
result.getKeyGenerators().put("snowflake", new
AlgorithmConfiguration("SNOWFLAKE", new Properties()));
result.getAuditors().put("sharding_key_required_auditor", new
AlgorithmConfiguration("DML_SHARDING_CONDITIONS", new Properties()));
return result;
}
private ShardingTableRuleConfiguration
getgoodsOrderTableRuleConfiguration() {
ShardingTableRuleConfiguration result = new
ShardingTableRuleConfiguration("orders", "goods.orders_$->{0..1}");
result.setTableShardingStrategy(new
StandardShardingStrategyConfiguration("user_id", "goods_tp_orders_inline"));
result.setDatabaseShardingStrategy(new
StandardShardingStrategyConfiguration("user_id", "goods_db_orders_inline"));
result.setKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("id", "snowflake"));
result.setAuditStrategy(new
ShardingAuditStrategyConfiguration(Collections.singleton("sharding_key_required_auditor"),
true));
return result;
}
private ShardingTableRuleConfiguration
getgoodsOrderItemTableRuleConfiguration() {
ShardingTableRuleConfiguration result = new
ShardingTableRuleConfiguration("orders_detail",
"goods.orders_detail_$->{0..1}");
result.setTableShardingStrategy(new
StandardShardingStrategyConfiguration("orders_id",
"goods_tp_orders_detail_inline"));
result.setKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("id", "snowflake"));
return result;
}
private ShardingTableRuleConfiguration
getSchoolOrderTableRuleConfiguration() {
ShardingTableRuleConfiguration result = new
ShardingTableRuleConfiguration("orders", "school.orders_$->{0..1}");
result.setDatabaseShardingStrategy(new
StandardShardingStrategyConfiguration("user_id", "goods_db_orders_inline"));
result.setTableShardingStrategy(new
StandardShardingStrategyConfiguration("user_id", "school_tp_orders_inline"));
result.setKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("id", "snowflake"));
result.setAuditStrategy(new
ShardingAuditStrategyConfiguration(Collections.singleton("sharding_key_required_auditor"),
true));
return result;
}
private ShardingTableRuleConfiguration
getSchoolOrderItemTableRuleConfiguration() {
ShardingTableRuleConfiguration result = new
ShardingTableRuleConfiguration("orders_detail",
"school.orders_detail_$->{0..1}");
result.setTableShardingStrategy(new
StandardShardingStrategyConfiguration("orders_id",
"school_tp_orders_detail_inline"));
result.setKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("id", "snowflake"));
return result;
}
@Data
@Slf4j
@Service("customDataBaseShardingAlgorithm")
public class CustomDataBaseShardingAlgorithm implements
StandardShardingAlgorithm<String> {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd
HH:mm:ss");//定义格式,不显示毫秒
/**
*
* @param databaseNames
* @param preciseShardingValue
* @return
*/
@Override
public String doSharding(Collection<String> databaseNames,
PreciseShardingValue<String> preciseShardingValue) {
List<String> databaseNameList = new ArrayList<>(databaseNames);
String physicDatabase = null;
String shardColumn= preciseShardingValue.getValue();
int subValue =
Integer.parseInt(shardColumn.substring(shardColumn.length()-1)) % 2;
physicDatabase = databaseNameList.get(subValue);
log.info("----->分片数据库{},分片键是={},逻辑表是={},分片值是={}",physicDatabase,preciseShardingValue.getColumnName(),preciseShardingValue.getLogicTableName(),preciseShardingValue.getValue());
if (StringUtils.isBlank(physicDatabase)) {
log.info("----->该分片键值找不到对应的分库,默认取第一个库,分片键是={},逻辑表是={},分片值是={}",
preciseShardingValue.getColumnName(), preciseShardingValue.getLogicTableName(),
preciseShardingValue.getValue());
for (String value : databaseNames) {
physicDatabase = value;
break;
}
}
return physicDatabase;
}
@Override
public Collection<String> doSharding(Collection<String>
availableTargetNames, RangeShardingValue<String> shardingValue) {
return availableTargetNames;
}
}
Please help me take a look,thank you
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail:
[email protected]
For queries about this service, please contact Infrastructure at:
[email protected]