环境:springboot2.3.9.RELEASE + shardingsphere4.0.1 + Oracle
当连接oracle数据库的当前用户下表少的时候可能感觉不出来,当数据表很多时会导致服务启动超级慢,我项目中有200多张表,启动服务时非常的慢。
- 定位问题
通过debug调试,定位到
TableMetaDataInitializer.java这个类中的如下方法在启动服务时非常的耗时。
private Map<String, TableMetaData> loadDefaultTables(final ShardingRule shardingRule) throws SQLException {
Map<String, TableMetaData> result = new HashMap<>(shardingRule.getTableRules().size(), 1);
Optional<String> actualDefaultDataSourceName = shardingRule.findActualDefaultDataSourceName();
if (actualDefaultDataSourceName.isPresent()) {
for (String each : getAllTableNames(actualDefaultDataSourceName.get())) {
result.put(each, tableMetaDataLoader.load(each, shardingRule));
}
}
return result;
}
这里的getAllTableNames方法是获取当前用户下的所有的表,然后一个一个地遍历去加载表的元信息。
tableMetaDataLo

针对ShardingSphere在大量Oracle表环境下启动缓慢的问题,本文提出两种解决方案:一是禁用表元信息加载;二是采用多线程并行加载方式,显著提升了服务启动效率。

301

被折叠的 条评论
为什么被折叠?



