Commit 183504f3 authored by terrymanu's avatar terrymanu
Browse files

refactor codes for #1695

parent 458d9888
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -56,9 +56,8 @@ public final class ShardingContext implements AutoCloseable {
    
    private final ShardingMetaData metaData;
    
    public ShardingContext(final DatabaseMetaData databaseMetaData, final Map<String, DataSource> dataSourceMap, final ShardingRule shardingRule,
                           final DatabaseType databaseType, final Properties props) throws SQLException {
        this.databaseMetaData = databaseMetaData;
    public ShardingContext(final Map<String, DataSource> dataSourceMap, final ShardingRule shardingRule, final DatabaseType databaseType, final Properties props) throws SQLException {
        this.databaseMetaData = getDatabaseMetaData(dataSourceMap);
        this.shardingRule = shardingRule;
        this.databaseType = databaseType;
        shardingProperties = new ShardingProperties(null == props ? new Properties() : props);
@@ -69,6 +68,12 @@ public final class ShardingContext implements AutoCloseable {
                shardingProperties.<Boolean>getValue(ShardingPropertiesConstant.CHECK_TABLE_METADATA_ENABLED));
    }
    
    private DatabaseMetaData getDatabaseMetaData(final Map<String, DataSource> dataSourceMap) throws SQLException {
        try (Connection connection = dataSourceMap.values().iterator().next().getConnection()) {
            return connection.getMetaData();
        }
    }
    
    private Map<String, String> getDataSourceURLs(final Map<String, DataSource> dataSourceMap) throws SQLException {
        Map<String, String> result = new LinkedHashMap<>(dataSourceMap.size(), 1);
        for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
+2 −2
Original line number Diff line number Diff line
@@ -55,8 +55,8 @@ public final class MasterSlaveConnection extends AbstractConnectionAdapter {
    }
    
    @Override
    public DatabaseMetaData getMetaData() throws SQLException {
        return getConnection(masterSlaveDataSource.getMasterSlaveRule().getMasterDataSourceName()).getMetaData();
    public DatabaseMetaData getMetaData() {
        return masterSlaveDataSource.getDatabaseMetaData();
    }
    
    @Override
+5 −5
Original line number Diff line number Diff line
@@ -45,35 +45,35 @@ import java.util.Properties;
@Slf4j
public class MasterSlaveDataSource extends AbstractDataSourceAdapter {
    
    private final MasterSlaveRule masterSlaveRule;
    
    private final DatabaseMetaData databaseMetaData;
    
    private final MasterSlaveRule masterSlaveRule;
    
    private final ShardingProperties shardingProperties;
    
    public MasterSlaveDataSource(final Map<String, DataSource> dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig,
                                 final Map<String, Object> configMap, final Properties props) throws SQLException {
        super(dataSourceMap);
        databaseMetaData = getDatabaseMetaData(dataSourceMap);
        if (!configMap.isEmpty()) {
            ConfigMapContext.getInstance().getConfigMap().putAll(configMap);
        }
        this.masterSlaveRule = new MasterSlaveRule(masterSlaveRuleConfig);
        databaseMetaData = getDatabaseMetaData(dataSourceMap);
        shardingProperties = new ShardingProperties(null == props ? new Properties() : props);
    }
    
    public MasterSlaveDataSource(final Map<String, DataSource> dataSourceMap, final MasterSlaveRule masterSlaveRule, final Map<String, Object> configMap, final Properties props) throws SQLException {
        super(dataSourceMap);
        databaseMetaData = getDatabaseMetaData(dataSourceMap);
        if (!configMap.isEmpty()) {
            ConfigMapContext.getInstance().getConfigMap().putAll(configMap);
        }
        this.masterSlaveRule = masterSlaveRule;
        databaseMetaData = getDatabaseMetaData(dataSourceMap);
        shardingProperties = new ShardingProperties(null == props ? new Properties() : props);
    }
    
    private DatabaseMetaData getDatabaseMetaData(final Map<String, DataSource> dataSourceMap) throws SQLException {
        try (Connection connection = dataSourceMap.get(masterSlaveRule.getMasterDataSourceName()).getConnection()) {
        try (Connection connection = dataSourceMap.values().iterator().next().getConnection()) {
            return connection.getMetaData();
        }
    }
+1 −23
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package io.shardingsphere.shardingjdbc.jdbc.core.datasource;

import com.google.common.base.Preconditions;
import io.shardingsphere.api.ConfigMapContext;
import io.shardingsphere.core.rule.MasterSlaveRule;
import io.shardingsphere.core.rule.ShardingRule;
import io.shardingsphere.shardingjdbc.jdbc.adapter.AbstractDataSourceAdapter;
import io.shardingsphere.shardingjdbc.jdbc.core.ShardingContext;
@@ -29,10 +28,7 @@ import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
@@ -60,8 +56,7 @@ public class ShardingDataSource extends AbstractDataSourceAdapter {
        if (!configMap.isEmpty()) {
            ConfigMapContext.getInstance().getConfigMap().putAll(configMap);
        }
        Map<String, DataSource> originalDataSourceMap = getDataSourceMap();
        shardingContext = new ShardingContext(getDatabaseMetaData(originalDataSourceMap, shardingRule), originalDataSourceMap, shardingRule, getDatabaseType(), props);
        shardingContext = new ShardingContext(getDataSourceMap(), shardingRule, getDatabaseType(), props);
    }
    
    private void checkDataSourceType(final Map<String, DataSource> dataSourceMap) {
@@ -70,23 +65,6 @@ public class ShardingDataSource extends AbstractDataSourceAdapter {
        }
    }
    
    private DatabaseMetaData getDatabaseMetaData(final Map<String, DataSource> dataSourceMap, final ShardingRule shardingRule) throws SQLException {
        Collection<MasterSlaveRule> masterSlaveRules = shardingRule.getMasterSlaveRules();
        if (masterSlaveRules.isEmpty()) {
            try (Connection connection = dataSourceMap.values().iterator().next().getConnection()) {
                return connection.getMetaData();
            }
        }
        for (MasterSlaveRule each : masterSlaveRules) {
            if (getDataSourceMap().containsKey(each.getMasterDataSourceName())) {
                try (Connection connection = dataSourceMap.get(each.getMasterDataSourceName()).getConnection()) {
                    return connection.getMetaData();
                }
            }
        }
        throw new UnsupportedOperationException();
    }
    
    @Override
    public final ShardingConnection getConnection() {
        return new ShardingConnection(getShardingTransactionalDataSources().getDataSourceMap(), shardingContext, TransactionTypeHolder.get());