Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/dev' into dev
Browse files Browse the repository at this point in the history
  • Loading branch information
tuohai666 committed May 9, 2018
2 parents c4ef3c0 + d64fa6c commit 3826cc3
Show file tree
Hide file tree
Showing 27 changed files with 376 additions and 183 deletions.
15 changes: 1 addition & 14 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@
<guava-retrying.version>2.0.0</guava-retrying.version>
<quartz.version>2.3.0</quartz.version>
<opentracing.version>0.30.0</opentracing.version>
<powermock.version>1.7.1</powermock.version>


<maven-compiler-plugin.version>3.3</maven-compiler-plugin.version>
<maven-assembly-plugin.version>3.1.0</maven-assembly-plugin.version>
<maven-resources-plugin.version>2.7</maven-resources-plugin.version>
Expand Down Expand Up @@ -310,18 +309,6 @@
<version>${spring-boot.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.opentracing</groupId>
<artifactId>opentracing-mock</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

/**
* Column metadata.
Expand All @@ -29,6 +30,7 @@
@RequiredArgsConstructor
@Getter
@EqualsAndHashCode
@ToString
public final class ColumnMetaData {

private final String columnName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.rule.TableRule;
import lombok.Getter;
import lombok.Setter;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
Expand All @@ -33,25 +36,40 @@
* Abstract Sharding metadata.
*
* @author panjuan
* @author zhaojun
*/
@Getter
@Setter
public abstract class ShardingMetaData {

private Map<String, TableMetaData> tableMetaDataMap;

private Map<String, Connection> cachedConnectionMap = new HashMap<>();

/**
* Initialize sharding meta data.
* Initialize sharding metadata.
*
* @param shardingRule sharding rule
* @throws SQLException SQL exception
*/
public void init(final ShardingRule shardingRule) throws SQLException {
tableMetaDataMap = new HashMap<>(shardingRule.getTableRules().size(), 1);
for (TableRule each : shardingRule.getTableRules()) {
tableMetaDataMap.put(each.getLogicTable(), getTableMetaData(each.getLogicTable(), each.getActualDataNodes(), shardingRule.getShardingDataSourceNames()));
refresh(each, shardingRule);
}
}


/**
* refresh each tableMetaData by TableRule.
*
* @param each table rule
* @param shardingRule sharding rule
* @throws SQLException SQL Exception
*/
public void refresh(final TableRule each, final ShardingRule shardingRule) throws SQLException {
tableMetaDataMap.put(each.getLogicTable(), getTableMetaData(each.getLogicTable(), each.getActualDataNodes(), shardingRule.getShardingDataSourceNames()));
}

private TableMetaData getTableMetaData(final String logicTableName, final List<DataNode> actualDataNodes, final ShardingDataSourceNames shardingDataSourceNames) throws SQLException {
Collection<ColumnMetaData> result = null;
for (DataNode each : actualDataNodes) {
Expand All @@ -60,13 +78,33 @@ private TableMetaData getTableMetaData(final String logicTableName, final List<D
result = columnMetaDataList;
}
if (!result.equals(columnMetaDataList)) {
throw new ShardingJdbcException("Cannot get uniformed table structure for '%s'.", logicTableName);
throw new ShardingJdbcException(getErrorMsgOfTableMetaData(logicTableName, result, columnMetaDataList));
}
}
return new TableMetaData(result);
}

protected abstract Collection<ColumnMetaData> getColumnMetaDataList(DataNode dataNode, ShardingDataSourceNames shardingDataSourceNames) throws SQLException;
/**
* Get column metadata implementing by concrete handler.
*
* @param dataNode DataNode
* @param shardingDataSourceNames ShardingDataSourceNames
* @return ColumnMetaData
* @throws SQLException SQL exception
*/
public abstract Collection<ColumnMetaData> getColumnMetaDataList(DataNode dataNode, ShardingDataSourceNames shardingDataSourceNames) throws SQLException;

private String getErrorMsgOfTableMetaData(final String logicTableName, final Collection<ColumnMetaData> oldColumnMetaDataList, final Collection<ColumnMetaData> newColumnMetaDataList) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(" Cannot get uniformed table structure for ").append(logicTableName).append(".");
stringBuilder.append(" The different column metadata of actual tables is as follows: ");
for (ColumnMetaData each : oldColumnMetaDataList) {
stringBuilder.append(each.toString()).append(" ");
}
stringBuilder.append("\n");
for (ColumnMetaData each : newColumnMetaDataList) {
stringBuilder.append(each.toString()).append(" ");
}
return stringBuilder.toString();
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package io.shardingjdbc.core.routing;

import io.shardingjdbc.core.constant.SQLType;
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
import io.shardingjdbc.core.routing.router.sharding.GeneratedKey;
import lombok.Getter;
Expand All @@ -30,6 +31,7 @@
*
* @author gaohongtao
* @author zhangliang
* @author zhaojun
*/
@RequiredArgsConstructor
@Getter
Expand All @@ -40,4 +42,13 @@ public final class SQLRouteResult {
private final GeneratedKey generatedKey;

private final Set<SQLExecutionUnit> executionUnits = new LinkedHashSet<>();

/**
* whether SQLRouteResult can refresh table metadata.
*
* @return boolean
*/
public boolean canRefreshMetaData() {
return SQLType.DDL.equals(sqlStatement.getType()) && !sqlStatement.getTables().isEmpty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,23 +37,30 @@
import io.shardingjdbc.core.routing.SQLRouteResult;
import io.shardingjdbc.core.routing.StatementRoutingEngine;
import io.shardingjdbc.core.routing.router.sharding.GeneratedKey;
import io.shardingjdbc.core.rule.DataNode;
import io.shardingjdbc.core.rule.ShardingDataSourceNames;
import io.shardingjdbc.core.rule.TableRule;
import lombok.AccessLevel;
import lombok.Getter;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
* Statement that support sharding.
*
* @author gaohongtao
* @author caohao
* @author zhangliang
* @author zhaojun
*/
@Getter
public class ShardingStatement extends AbstractStatementAdapter {
Expand Down Expand Up @@ -116,10 +123,11 @@ public int executeUpdate(final String sql) throws SQLException {
try {
return generateExecutor(sql).executeUpdate();
} finally {
refreshShardingMetaData(routeResult);
currentResultSet = null;
}
}

@Override
public int executeUpdate(final String sql, final int autoGeneratedKeys) throws SQLException {
if (RETURN_GENERATED_KEYS == autoGeneratedKeys) {
Expand Down Expand Up @@ -157,10 +165,11 @@ public boolean execute(final String sql) throws SQLException {
try {
return generateExecutor(sql).execute();
} finally {
refreshShardingMetaData(routeResult);
currentResultSet = null;
}
}

@Override
public boolean execute(final String sql, final int autoGeneratedKeys) throws SQLException {
if (RETURN_GENERATED_KEYS == autoGeneratedKeys) {
Expand Down Expand Up @@ -213,6 +222,26 @@ private void clearPrevious() throws SQLException {
}
routedStatements.clear();
}

private void refreshShardingMetaData(final SQLRouteResult routeResult) throws SQLException {
if (routeResult.canRefreshMetaData()) {
ShardingContext context = connection.getShardingContext();
String logicTable = routeResult.getSqlStatement().getTables().getSingleTableName();
TableRule tableRule = context.getShardingRule().getTableRule(logicTable);
ShardingDataSourceNames shardingDataSourceNames = context.getShardingRule().getShardingDataSourceNames();
doRefreshInternal(context, tableRule, shardingDataSourceNames);
}
}

private void doRefreshInternal(ShardingContext context, TableRule tableRule, ShardingDataSourceNames shardingDataSourceNames) throws SQLException {
Map<String, Connection> cachedConnectionMap = new HashMap<>();
for (DataNode each : tableRule.getActualDataNodes()) {
String dataSourceName = shardingDataSourceNames.getRawMasterDataSourceName(each.getDataSourceName());
cachedConnectionMap.put(dataSourceName, connection.getConnection(dataSourceName));
}
context.getShardingMetaData().setCachedConnectionMap(cachedConnectionMap);
context.getShardingMetaData().refresh(tableRule, context.getShardingRule());
}

@Override
public ResultSet getGeneratedKeys() throws SQLException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,12 @@ public final class JDBCShardingMetaData extends ShardingMetaData {
private final DatabaseType databaseType;

@Override
protected Collection<ColumnMetaData> getColumnMetaDataList(final DataNode dataNode, final ShardingDataSourceNames shardingDataSourceNames) throws SQLException {
return ShardingMetaDataHandlerFactory.newInstance(
dataSourceMap.get(shardingDataSourceNames.getRawMasterDataSourceName(dataNode.getDataSourceName())), dataNode.getTableName(), databaseType).getColumnMetaDataList();
public Collection<ColumnMetaData> getColumnMetaDataList(final DataNode dataNode, final ShardingDataSourceNames shardingDataSourceNames) throws SQLException {
String dataSourceName = shardingDataSourceNames.getRawMasterDataSourceName(dataNode.getDataSourceName());
if (getCachedConnectionMap().containsKey(dataSourceName)) {
return ShardingMetaDataHandlerFactory.newInstance(dataNode.getTableName(), databaseType).getColumnMetaDataList(getCachedConnectionMap().get(dataSourceName));
} else {
return ShardingMetaDataHandlerFactory.newInstance(dataSourceMap.get(dataSourceName), dataNode.getTableName(), databaseType).getColumnMetaDataList();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public final class ShardingMetaDataHandlerFactory {
* @param dataSource data source
* @param actualTableName actual table name
* @param databaseType database type
* @return sharding meta data handler
* @return sharding metadata handler
*/
public static ShardingMetaDataHandler newInstance(final DataSource dataSource, final String actualTableName, final DatabaseType databaseType) {
switch (databaseType) {
Expand All @@ -53,4 +53,15 @@ public static ShardingMetaDataHandler newInstance(final DataSource dataSource, f
return new DefaultShardingMetaDataHandler(dataSource, actualTableName);
}
}

/**
* To generate table metadata handler by existing sharding connection.
*
* @param actualTableName actual table name
* @param databaseType database type
* @return sharding metadata handler
*/
public static ShardingMetaDataHandler newInstance(final String actualTableName, final DatabaseType databaseType) {
return newInstance(null, actualTableName, databaseType);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,16 @@
import io.shardingjdbc.core.metadata.ColumnMetaData;

import javax.sql.DataSource;
import java.util.Collection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;

/**
* MySQL table metadata handler.
*
* @author panjuan
* @author zhaojun
*/
public final class DefaultShardingMetaDataHandler extends ShardingMetaDataHandler {

Expand All @@ -35,7 +38,7 @@ public DefaultShardingMetaDataHandler(final DataSource dataSource, final String
}

@Override
public Collection<ColumnMetaData> getColumnMetaDataList() {
public List<ColumnMetaData> geColumnMetaInternal(final Statement statement) throws SQLException {
return new LinkedList<>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,17 @@
import io.shardingjdbc.core.metadata.ColumnMetaData;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

/**
* MySQL table metadata handler.
*
* @author panjuan
* @author zhaojun
*/
public final class H2ShardingMetaDataHandler extends ShardingMetaDataHandler {

Expand All @@ -40,11 +39,24 @@ public H2ShardingMetaDataHandler(final DataSource dataSource, final String actua
}

@Override
public Collection<ColumnMetaData> getColumnMetaDataList() throws SQLException {
public List<ColumnMetaData> geColumnMetaInternal(final Statement statement) throws SQLException {
List<ColumnMetaData> result = new LinkedList<>();
try (Connection connection = getDataSource().getConnection();
Statement statement = connection.createStatement()) {
ResultSet resultSet = statement.executeQuery(String.format("show columns from %s", getActualTableName()));
if (isTableExist(statement)) {
result = getExistColumnMeta(statement);
}
return result;
}

private boolean isTableExist(final Statement statement) throws SQLException {
try (ResultSet resultSet = statement.getConnection().getMetaData().getTables(null, null, getActualTableName(), null)) {
return resultSet.next();
}
}

private List<ColumnMetaData> getExistColumnMeta(final Statement statement) throws SQLException {
List<ColumnMetaData> result = new LinkedList<>();
statement.executeQuery(String.format("show columns from %s;", getActualTableName()));
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
result.add(new ColumnMetaData(resultSet.getString("FIELD"), resultSet.getString("TYPE"), resultSet.getString("KEY")));
}
Expand Down
Loading

0 comments on commit 3826cc3

Please sign in to comment.