Commit 458d9888 authored by terrymanu's avatar terrymanu
Browse files

fixed #1695

parent df26f836
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -40,8 +40,8 @@ public final class ShardingMetaData {
    
    private final ShardingTableMetaData table;
    
    public ShardingMetaData(final Map<String, String> dataSourceURLs, final ShardingRule shardingRule, final DatabaseType databaseType, 
                            final ShardingExecuteEngine executeEngine, final TableMetaDataConnectionManager connectionManager, final int maxConnectionsSizePerQuery, final boolean isCheckingMetaData) {
    public ShardingMetaData(final Map<String, String> dataSourceURLs, final ShardingRule shardingRule, final DatabaseType databaseType, final ShardingExecuteEngine executeEngine, 
                            final TableMetaDataConnectionManager connectionManager, final int maxConnectionsSizePerQuery, final boolean isCheckingMetaData) {
        dataSource = new ShardingDataSourceMetaData(dataSourceURLs, shardingRule, databaseType);
        table = new ShardingTableMetaData(new TableMetaDataInitializer(dataSource, executeEngine, connectionManager, maxConnectionsSizePerQuery, isCheckingMetaData).load(shardingRule));
    }
+5 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import lombok.Getter;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -43,6 +44,8 @@ import java.util.Properties;
@Getter
public final class ShardingContext implements AutoCloseable {
    
    private final DatabaseMetaData databaseMetaData;
    
    private final ShardingRule shardingRule;
    
    private final DatabaseType databaseType;
@@ -53,8 +56,9 @@ public final class ShardingContext implements AutoCloseable {
    
    private final ShardingMetaData metaData;
    
    public ShardingContext(final Map<String, DataSource> dataSourceMap, final ShardingRule shardingRule,
    public ShardingContext(final DatabaseMetaData databaseMetaData, final Map<String, DataSource> dataSourceMap, final ShardingRule shardingRule,
                           final DatabaseType databaseType, final Properties props) throws SQLException {
        this.databaseMetaData = databaseMetaData;
        this.shardingRule = shardingRule;
        this.databaseType = databaseType;
        shardingProperties = new ShardingProperties(null == props ? new Properties() : props);
+2 −13
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@

package io.shardingsphere.shardingjdbc.jdbc.core.connection;

import io.shardingsphere.core.rule.MasterSlaveRule;
import io.shardingsphere.shardingjdbc.jdbc.adapter.AbstractConnectionAdapter;
import io.shardingsphere.shardingjdbc.jdbc.core.ShardingContext;
import io.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement;
@@ -31,7 +30,6 @@ import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.Map;

/**
@@ -69,17 +67,8 @@ public final class ShardingConnection extends AbstractConnectionAdapter {
    }
    
    @Override
    public DatabaseMetaData getMetaData() throws SQLException {
        Collection<MasterSlaveRule> masterSlaveRules = shardingContext.getShardingRule().getMasterSlaveRules();
        if (masterSlaveRules.isEmpty()) {
            return getConnection(dataSourceMap.keySet().iterator().next()).getMetaData();
        }
        for (MasterSlaveRule each : masterSlaveRules) {
            if (getDataSourceMap().containsKey(each.getMasterDataSourceName())) {
                return getConnection(each.getMasterDataSourceName()).getMetaData();
            }
        }
        throw new UnsupportedOperationException();
    public DatabaseMetaData getMetaData() {
        return shardingContext.getDatabaseMetaData();
    }
    
    @Override
+12 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ 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.Map;
import java.util.Properties;
@@ -45,6 +47,8 @@ public class MasterSlaveDataSource extends AbstractDataSourceAdapter {
    
    private final MasterSlaveRule masterSlaveRule;
    
    private final DatabaseMetaData databaseMetaData;
    
    private final ShardingProperties shardingProperties;
    
    public MasterSlaveDataSource(final Map<String, DataSource> dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig,
@@ -54,6 +58,7 @@ public class MasterSlaveDataSource extends AbstractDataSourceAdapter {
            ConfigMapContext.getInstance().getConfigMap().putAll(configMap);
        }
        this.masterSlaveRule = new MasterSlaveRule(masterSlaveRuleConfig);
        databaseMetaData = getDatabaseMetaData(dataSourceMap);
        shardingProperties = new ShardingProperties(null == props ? new Properties() : props);
    }
    
@@ -63,9 +68,16 @@ public class MasterSlaveDataSource extends AbstractDataSourceAdapter {
            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()) {
            return connection.getMetaData();
        }
    }
    
    @Override
    public final MasterSlaveConnection getConnection() {
        return new MasterSlaveConnection(this, getShardingTransactionalDataSources().getDataSourceMap(), TransactionTypeHolder.get());
+23 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ 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;
@@ -28,7 +29,10 @@ 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;
@@ -56,7 +60,8 @@ public class ShardingDataSource extends AbstractDataSourceAdapter {
        if (!configMap.isEmpty()) {
            ConfigMapContext.getInstance().getConfigMap().putAll(configMap);
        }
        shardingContext = new ShardingContext(getDataSourceMap(), shardingRule, getDatabaseType(), props);
        Map<String, DataSource> originalDataSourceMap = getDataSourceMap();
        shardingContext = new ShardingContext(getDatabaseMetaData(originalDataSourceMap, shardingRule), originalDataSourceMap, shardingRule, getDatabaseType(), props);
    }
    
    private void checkDataSourceType(final Map<String, DataSource> dataSourceMap) {
@@ -65,6 +70,23 @@ 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());
Loading