事故现场
项目启动时报错如下
事故排查
创建sharding数据源时,默认会加载数据库中所有表的元数据。在加载元数据的逻辑中经过debug发现“罪魁祸首”(背锅的)是项目数据库里一张名为sys_user的表,因为人大金仓数据库里同样有一张名为sys_user的内置表。具体细节如下
解决方案
在创建sharding数据源时不加载sys_user的元数据,避免上面会报错的逻辑。因为分析项目情况后发现其实并没有必要加载数据库中所有表的元数据,只需要加载项目配置的逻辑表的元数据就行(sys_user恰恰不在配置的逻辑表里),这同时也大大节省了创建sharding数据源的时间。具体细节如下
自定义ShardingRule
public class LocalShardingRule extends ShardingRule {
public LocalShardingRule(ShardingRuleConfiguration shardingRuleConfig, Collection<String> dataSourceNames) {
super(shardingRuleConfig, dataSourceNames);
}
@Override
public Optional<String> findActualDefaultDataSourceName() {
return Optional.empty();
}
}
创建ShardingDataSource时使用自定义的ShardingRule
return new ShardingDataSource(dataSourceMap, new LocalShardingRule(shardingRuleConfig, datasourceNames), properties);