Sharding-Jdbc导致线上服务器CPU负载过高的排查

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;
    }
}

猜你喜欢

转载自blog.csdn.net/u013202238/article/details/108253868