查看启动日志,发现数据源初始化时,postgresql数据源特别慢,耗时30秒~2分钟,Debug发现慢在loadDefaultTables方法。
Mysql数据源,getAllTableNames()无返回值,而postgresql数据源返回了200多个表名,随着表的增加,postgresql数据源的初始化将会越来越慢。
由于项目只访问postgresql中的几个分表,可考虑只加载分表,不加载其他表,即不进入下面这段代码:
if (actualDefaultDataSourceName.isPresent()) {
Iterator var4 = this.getAllTableNames((String)actualDefaultDataSourceName.get()).iterator();while(var4.hasNext()) {
String each = (String)var4.next();
result.put(each, this.tableMetaDataLoader.load(each, shardingRule));
}
}
故考虑重写ShardingRule的findActualDefaultDataSourceName()方法,使返回值不是Present。
重写代码如下:
public class ShardingRuleLocal extends ShardingRule { public ShardingRuleLocal(ShardingRuleConfiguration shardingRuleConfig, Collection<String> dataSourceNames) { super(shardingRuleConfig, dataSourceNames); } @Override public Optional<String> findActualDefaultDataSourceName() { return Optional.absent(); } }
建数据源:
new ShardingDataSource(dataSources, new ShardingRuleLocal(shardingRuleConfig, dataSources.keySet()), new ConcurrentHashMap(), properties)
再次启动后加载postgresql数据源的速度提高到了2s。