Sharding-Jdbc1.4.1 导致线上服务器CPU负载过高的排查
com.dangdang.ddframe.rdb.sharding.api.rule.TableRule
public class TableRule {
public TableRule(final String logicTable, final boolean dynamic, final List<String> actualTables, final DataSourceRule dataSourceRule, final Collection<String> dataSourceNames,
final DatabaseShardingStrategy databaseShardingStrategy, final TableShardingStrategy tableShardingStrategy) {
Preconditions.checkNotNull(logicTable);
this.logicTable = logicTable;
this.dynamic = dynamic;
this.databaseShardingStrategy = databaseShardingStrategy;
this.tableShardingStrategy = tableShardingStrategy;
if (dynamic) {
Preconditions.checkNotNull(dataSourceRule);
this.actualTables = generateDataNodes(dataSourceRule);
} else if (null == actualTables || actualTables.isEmpty()) {
Preconditions.checkNotNull(dataSourceRule);
this.actualTables = generateDataNodes(Collections.singletonList(logicTable), dataSourceRule, dataSourceNames);
} else {
this.actualTables = generateDataNodes(actualTables, dataSourceRule, dataSourceNames);
}
}
/**
* 获取真实数据源.
*
* @return 真实表名称
*/
public Collection<String> getActualDatasourceNames() {
Collection<String> result = new LinkedHashSet<>(actualTables.size());
for (DataNode each : actualTables) {
result.add(each.getDataSourceName());
}
return result;
}
/**
* 根据数据源名称过滤获取真实表名称.
*
* @param targetDataSources 数据源名称
* @return 真实表名称
*/
public Collection<String> getActualTableNames(final Collection<String> targetDataSources) {
Collection<String> result = new LinkedHashSet<>(actualTables.size());
for (DataNode each : actualTables) {
if (targetDataSources.contains(each.getDataSourceName())) {
result.add(each.getTableName());
}
}
return result;
}
...........
}
优化代码
public class OptimizedTableRule extends TableRule {
private final Collection<String> tableNames;
private final Collection<String> datasourceNames;
public OptimizedTableRule(String logicTable, boolean dynamic, List<String> actualTables, DataSourceRule dataSourceRule, Collection<String> dataSourceNames, DatabaseShardingStrategy databaseShardingStrategy, TableShardingStrategy tableShardingStrategy) {
super(logicTable, dynamic, actualTables, dataSourceRule, dataSourceNames, databaseShardingStrategy, tableShardingStrategy);
this.datasourceNames = dataSourceRule.getDataSourceNames();
this.tableNames = actualTables;
}
/**
* 获取真实数据源.
*
* @return 真实表名称
*/
public Collection<String> getActualDatasourceNames() {
return datasourceNames;
}
/**
* 根据数据源名称过滤获取真实表名称.
*
* @param targetDataSources 数据源名称
* @return 真实表名称
*/
public Collection<String> getActualTableNames(final Collection<String> targetDataSources) {
return tableNames;
}
}