good-134 opened a new issue, #32591:
URL: https://github.com/apache/shardingsphere/issues/32591
I have observed an unexpected behavior in ShardingSphere's table sharding
configuration. My configuration doesn't explicitly specify all physical tables,
yet it works correctly. I'm trying to understand why this is possible.
Here's my current configuration and sharding code:
```
shardingsphere:
datasource:
names: ds0
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url:
jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username: root
password: '111111'
rules:
sharding:
key-generate:
snowflake-gen:
type: SNOWFLAKE
shardingAlgorithms:
agreement-table-complex-algorithm:
type: CLASS_BASED
props:
strategy: COMPLEX
algorithmClassName: biz.demo.config.sharding.AgreementAlgorithm
tables:
agreement:
actual-data-nodes: ds0.agreement
table-strategy:
complex:
sharding-algorithm-name: agreement-table-complex-algorithm
sharding-columns: id,create_time
props:
sql-show: true
```
```
public Collection<String> doSharding(Collection<String>
availableTargetNames, ComplexKeysShardingValue<Long> complexKeysShardingValue) {
Map<String, Range<Long>> columnNameAndRangeValuesMap =
complexKeysShardingValue.getColumnNameAndRangeValuesMap();
Map<String, Collection<Long>> columnNameAndShardingValuesMap =
complexKeysShardingValue.getColumnNameAndShardingValuesMap();
List<String> actualTarget = new ArrayList<>();
Snowflake snowflakeInstances = Snow.getSnowflakeInstances();
Collection<Long> idKeyColl =
columnNameAndShardingValuesMap.get("id");
String logicTableName = complexKeysShardingValue.getLogicTableName();
if (CollectionUtils.isNotEmpty(idKeyColl)) {
for (Long id : idKeyColl) {
long generateDateTime =
snowflakeInstances.getGenerateDateTime(id);
int suffix =
Math.abs(String.valueOf(generateDateTime).hashCode() % 4);
String tb = logicTableName + "_" + suffix;
actualTarget.add(tb);
}
}
return actualTarget;
}
```
In my database, I have four physical tables: agreement_0, agreement_1,
agreement_2, and agreement_3. However, in my configuration, I've only specified
actual-data-nodes: ds0.agreement instead of actual-data-nodes:
ds0.agreement_$->{0..3}.
Despite this, my sharding setup works correctly. The system successfully
routes queries to the appropriate physical tables.
My questions are:
1. Why does this configuration work without explicitly specifying all
physical tables?
2. Is this behavior intentional or a side effect of how ShardingSphere
processes configurations?
3. Are there any potential risks or downsides to using this simplified
configuration in a production environment?
4. Is there any documentation that explains this behavior?
Is there some default behavior in ShardingSphere that I'm not aware of, or
is it related to my custom sharding algorithm?
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]