diff --git a/pom.xml b/pom.xml index a007aca55413a..ed66a5a06859b 100644 --- a/pom.xml +++ b/pom.xml @@ -52,8 +52,7 @@ 2.0.0 2.3.0 0.30.0 - 1.7.1 - + 3.3 3.1.0 2.7 @@ -310,18 +309,6 @@ ${spring-boot.version} test - - org.powermock - powermock-module-junit4 - ${powermock.version} - test - - - org.powermock - powermock-api-mockito2 - ${powermock.version} - test - io.opentracing opentracing-mock diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/metadata/ColumnMetaData.java b/sharding-core/src/main/java/io/shardingjdbc/core/metadata/ColumnMetaData.java index 933b55ee5bbd7..7977d69de93d0 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/metadata/ColumnMetaData.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/metadata/ColumnMetaData.java @@ -20,6 +20,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.ToString; /** * Column metadata. @@ -29,6 +30,7 @@ @RequiredArgsConstructor @Getter @EqualsAndHashCode +@ToString public final class ColumnMetaData { private final String columnName; diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/metadata/ShardingMetaData.java b/sharding-core/src/main/java/io/shardingjdbc/core/metadata/ShardingMetaData.java index b8acc822e0d5d..00ebf745cb60d 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/metadata/ShardingMetaData.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/metadata/ShardingMetaData.java @@ -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; @@ -33,14 +36,18 @@ * Abstract Sharding metadata. * * @author panjuan + * @author zhaojun */ @Getter +@Setter public abstract class ShardingMetaData { private Map tableMetaDataMap; + + private Map cachedConnectionMap = new HashMap<>(); /** - * Initialize sharding meta data. + * Initialize sharding metadata. * * @param shardingRule sharding rule * @throws SQLException SQL exception @@ -48,10 +55,21 @@ public abstract class ShardingMetaData { 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 actualDataNodes, final ShardingDataSourceNames shardingDataSourceNames) throws SQLException { Collection result = null; for (DataNode each : actualDataNodes) { @@ -60,13 +78,33 @@ private TableMetaData getTableMetaData(final String logicTableName, final List 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 getColumnMetaDataList(DataNode dataNode, ShardingDataSourceNames shardingDataSourceNames) throws SQLException; + + private String getErrorMsgOfTableMetaData(final String logicTableName, final Collection oldColumnMetaDataList, final Collection 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(); + } } - - diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/routing/SQLRouteResult.java b/sharding-core/src/main/java/io/shardingjdbc/core/routing/SQLRouteResult.java index 42250e96b7822..0c1bfed44bac0 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/routing/SQLRouteResult.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/routing/SQLRouteResult.java @@ -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; @@ -30,6 +31,7 @@ * * @author gaohongtao * @author zhangliang + * @author zhaojun */ @RequiredArgsConstructor @Getter @@ -40,4 +42,13 @@ public final class SQLRouteResult { private final GeneratedKey generatedKey; private final Set executionUnits = new LinkedHashSet<>(); + + /** + * whether SQLRouteResult can refresh table metadata. + * + * @return boolean + */ + public boolean canRefreshMetaData() { + return SQLType.DDL.equals(sqlStatement.getType()) && !sqlStatement.getTables().isEmpty(); + } } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/core/statement/ShardingStatement.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/core/statement/ShardingStatement.java index 8f1f7fdc510d8..8fc11fec6b68d 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/core/statement/ShardingStatement.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/core/statement/ShardingStatement.java @@ -37,16 +37,22 @@ 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. @@ -54,6 +60,7 @@ * @author gaohongtao * @author caohao * @author zhangliang + * @author zhaojun */ @Getter public class ShardingStatement extends AbstractStatementAdapter { @@ -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) { @@ -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) { @@ -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 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 { diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/JDBCShardingMetaData.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/JDBCShardingMetaData.java index b638b3fa3042e..f858740d7b978 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/JDBCShardingMetaData.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/JDBCShardingMetaData.java @@ -47,8 +47,12 @@ public final class JDBCShardingMetaData extends ShardingMetaData { private final DatabaseType databaseType; @Override - protected Collection getColumnMetaDataList(final DataNode dataNode, final ShardingDataSourceNames shardingDataSourceNames) throws SQLException { - return ShardingMetaDataHandlerFactory.newInstance( - dataSourceMap.get(shardingDataSourceNames.getRawMasterDataSourceName(dataNode.getDataSourceName())), dataNode.getTableName(), databaseType).getColumnMetaDataList(); + public Collection 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(); + } } } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/ShardingMetaDataHandlerFactory.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/ShardingMetaDataHandlerFactory.java index 589a22dee367a..730396760e275 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/ShardingMetaDataHandlerFactory.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/ShardingMetaDataHandlerFactory.java @@ -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) { @@ -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); + } } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/DefaultShardingMetaDataHandler.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/DefaultShardingMetaDataHandler.java index ee1c5c9f65ff2..eb92d7edb318d 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/DefaultShardingMetaDataHandler.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/DefaultShardingMetaDataHandler.java @@ -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 { @@ -35,7 +38,7 @@ public DefaultShardingMetaDataHandler(final DataSource dataSource, final String } @Override - public Collection getColumnMetaDataList() { + public List geColumnMetaInternal(final Statement statement) throws SQLException { return new LinkedList<>(); } } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/H2ShardingMetaDataHandler.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/H2ShardingMetaDataHandler.java index 090a4f09361c9..324e82205cf82 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/H2ShardingMetaDataHandler.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/H2ShardingMetaDataHandler.java @@ -20,11 +20,9 @@ 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; @@ -32,6 +30,7 @@ * MySQL table metadata handler. * * @author panjuan + * @author zhaojun */ public final class H2ShardingMetaDataHandler extends ShardingMetaDataHandler { @@ -40,11 +39,24 @@ public H2ShardingMetaDataHandler(final DataSource dataSource, final String actua } @Override - public Collection getColumnMetaDataList() throws SQLException { + public List geColumnMetaInternal(final Statement statement) throws SQLException { List 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 getExistColumnMeta(final Statement statement) throws SQLException { + List 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"))); } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/MySQLShardingMetaDataHandler.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/MySQLShardingMetaDataHandler.java index c4fcfe1890994..a5b490f616116 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/MySQLShardingMetaDataHandler.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/MySQLShardingMetaDataHandler.java @@ -19,11 +19,9 @@ 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; @@ -31,19 +29,34 @@ * MySQL table metadata handler. * * @author panjuan + * @author zhaojun */ public final class MySQLShardingMetaDataHandler extends ShardingMetaDataHandler { public MySQLShardingMetaDataHandler(final DataSource dataSource, final String actualTableName) { super(dataSource, actualTableName); } - + @Override - public Collection getColumnMetaDataList() throws SQLException { + public List geColumnMetaInternal(final Statement statement) throws SQLException { + List result = new LinkedList<>(); + if (isTableExist(statement)) { + result = getExistColumnMeta(statement); + } + return result; + } + + private boolean isTableExist(final Statement statement) throws SQLException { + statement.executeQuery(String.format("show tables like '%s'", getActualTableName())); + try (ResultSet resultSet = statement.getResultSet()) { + return resultSet.next(); + } + } + + private List getExistColumnMeta(final Statement statement) throws SQLException { List result = new LinkedList<>(); - try (Connection connection = getDataSource().getConnection(); - Statement statement = connection.createStatement()) { - ResultSet resultSet = statement.executeQuery(String.format("desc %s", getActualTableName())); + statement.executeQuery(String.format("desc %s;", getActualTableName())); + try (ResultSet resultSet = statement.getResultSet()) { while (resultSet.next()) { result.add(new ColumnMetaData(resultSet.getString("Field"), resultSet.getString("Type"), resultSet.getString("Key"))); } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/ShardingMetaDataHandler.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/ShardingMetaDataHandler.java index 67023e5281f5f..e4b00dd625f1c 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/ShardingMetaDataHandler.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/metadata/dialect/ShardingMetaDataHandler.java @@ -23,13 +23,17 @@ import lombok.RequiredArgsConstructor; import javax.sql.DataSource; +import java.sql.Connection; import java.sql.SQLException; +import java.sql.Statement; import java.util.Collection; +import java.util.List; /** * Abstract table meta handler. * * @author panjuan + * @author zhaojun */ @RequiredArgsConstructor @Getter(AccessLevel.PROTECTED) @@ -45,5 +49,33 @@ public abstract class ShardingMetaDataHandler { * @return column meta data list * @throws SQLException SQL exception */ - public abstract Collection getColumnMetaDataList() throws SQLException; + public Collection getColumnMetaDataList() throws SQLException { + List result; + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement()) { + result = geColumnMetaInternal(statement); + } + return result; + } + + /** + * Get column metadata by Sharding Connection. + * + * @param connection connection + * @return column metadata List + * @throws SQLException SQL exception + */ + public Collection getColumnMetaDataList(final Connection connection) throws SQLException { + return geColumnMetaInternal(connection.createStatement()); + } + + /** + * Get column meta data internal. + * + * @param statement statement + * @return column meta data list + * @throws SQLException SQL exception + */ + public abstract List geColumnMetaInternal(Statement statement) throws SQLException; + } diff --git a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/api/ShardingDataSourceFactoryTest.java b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/api/ShardingDataSourceFactoryTest.java index 59f3d250f799d..22af1be4094d2 100644 --- a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/api/ShardingDataSourceFactoryTest.java +++ b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/api/ShardingDataSourceFactoryTest.java @@ -22,6 +22,7 @@ import io.shardingjdbc.core.jdbc.core.ShardingContext; import io.shardingjdbc.core.rule.ShardingRule; import org.junit.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; import javax.sql.DataSource; @@ -67,6 +68,9 @@ private Map getDataSourceMap() throws SQLException { when(databaseMetaData.getDatabaseProductName()).thenReturn("H2"); when(connection.createStatement()).thenReturn(statement); when(statement.executeQuery(Mockito.anyString())).thenReturn(resultSet); + when(statement.getConnection()).thenReturn(connection); + when(statement.getConnection().getMetaData().getTables(ArgumentMatchers.any(), ArgumentMatchers.any(), + ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(resultSet); when(resultSet.next()).thenReturn(false); Map result = new HashMap<>(1); result.put("ds", dataSource); diff --git a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/common/env/DatabaseEnvironment.java b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/common/env/DatabaseEnvironment.java index a181b0b168ab7..d9e6509a2cf45 100644 --- a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/common/env/DatabaseEnvironment.java +++ b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/common/env/DatabaseEnvironment.java @@ -57,19 +57,19 @@ private void fillData() { USERNAME.put(DatabaseType.MySQL, "root"); PASSWORD.put(DatabaseType.MySQL, ""); SCHEMA.put(DatabaseType.MySQL, null); - + DRIVER_CLASS_NAME.put(DatabaseType.PostgreSQL, org.postgresql.Driver.class.getName()); URL.put(DatabaseType.PostgreSQL, "jdbc:postgresql://db.psql:5432/%s"); USERNAME.put(DatabaseType.PostgreSQL, "postgres"); PASSWORD.put(DatabaseType.PostgreSQL, ""); SCHEMA.put(DatabaseType.PostgreSQL, null); - + DRIVER_CLASS_NAME.put(DatabaseType.SQLServer, com.microsoft.sqlserver.jdbc.SQLServerDriver.class.getName()); URL.put(DatabaseType.SQLServer, "jdbc:sqlserver://db.mssql:1433;DatabaseName=%s"); USERNAME.put(DatabaseType.SQLServer, "sa"); PASSWORD.put(DatabaseType.SQLServer, "Jdbc1234"); SCHEMA.put(DatabaseType.SQLServer, null); - + DRIVER_CLASS_NAME.put(DatabaseType.Oracle, "oracle.jdbc.driver.OracleDriver"); URL.put(DatabaseType.Oracle, "jdbc:oracle:thin:@db.oracle:8521:db_1"); USERNAME.put(DatabaseType.Oracle, "jdbc"); diff --git a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/datasource/ShardingDataSourceTest.java b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/datasource/ShardingDataSourceTest.java index e4478734e6056..95993b66dc9c8 100644 --- a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/datasource/ShardingDataSourceTest.java +++ b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/datasource/ShardingDataSourceTest.java @@ -126,6 +126,9 @@ private DataSource mockDataSource(final String dataBaseProductName) throws SQLEx when(result.getConnection()).thenReturn(connection); when(connection.createStatement()).thenReturn(statement); when(statement.executeQuery(ArgumentMatchers.any())).thenReturn(resultSet); + when(statement.getConnection()).thenReturn(connection); + when(statement.getConnection().getMetaData().getTables(ArgumentMatchers.any(), ArgumentMatchers.any(), + ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(resultSet); return result; } diff --git a/sharding-opentracing/pom.xml b/sharding-opentracing/pom.xml index f023678a1d911..2f751955a9e09 100644 --- a/sharding-opentracing/pom.xml +++ b/sharding-opentracing/pom.xml @@ -10,7 +10,7 @@ sharding-opentracing ${project.artifactId} - + io.shardingjdbc @@ -34,12 +34,12 @@ opentracing-mock - org.powermock - powermock-module-junit4 + junit + junit - org.powermock - powermock-api-mockito2 + org.mockito + mockito-core ch.qos.logback diff --git a/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/ExecuteEventListenerTest.java b/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/ExecuteEventListenerTest.java index 183bb54ecdb94..50770ca49cca6 100644 --- a/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/ExecuteEventListenerTest.java +++ b/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/ExecuteEventListenerTest.java @@ -39,8 +39,8 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public final class ExecuteEventListenerTest { diff --git a/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/ShardingJDBCTracerTest.java b/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/ShardingJDBCTracerTest.java index 44057b692a301..58698356f27bb 100644 --- a/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/ShardingJDBCTracerTest.java +++ b/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/ShardingJDBCTracerTest.java @@ -21,62 +21,60 @@ import io.opentracing.Tracer; import io.opentracing.util.GlobalTracer; import io.shardingjdbc.core.exception.ShardingJdbcException; -import io.shardingjdbc.opentracing.config.OpentracingConfigurationParser; import io.shardingjdbc.opentracing.fixture.FooTracer; -import org.hamcrest.core.Is; + +import static org.hamcrest.CoreMatchers.is; + +import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import java.lang.reflect.Field; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.mockStatic; -import static org.powermock.api.mockito.PowerMockito.when; +import static org.hamcrest.core.Is.isA; +import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; -@RunWith(PowerMockRunner.class) -@PrepareForTest(OpentracingConfigurationParser.class) public final class ShardingJDBCTracerTest { - - @Before - public void setUp() throws Exception { - mockStatic(System.class); - clearGlobalTracer(); - } - - @Test - public void assertDuplicatedLoading() { - ShardingJDBCTracer.init(mock(Tracer.class)); - Tracer t1 = ShardingJDBCTracer.get(); - ShardingJDBCTracer.init(); - assertEquals(t1, ShardingJDBCTracer.get()); - ShardingJDBCTracer.init(mock(Tracer.class)); - assertEquals(t1, ShardingJDBCTracer.get()); - } - - @Test - public void assertTracer() { - when(System.getProperty("shardingjdbc.opentracing.tracer.class")).thenReturn(FooTracer.class.getName()); - assertThat((GlobalTracer) ShardingJDBCTracer.get(), Is.isA(GlobalTracer.class)); - assertTrue(GlobalTracer.isRegistered()); - assertThat(ShardingJDBCTracer.get(), Is.is(ShardingJDBCTracer.get())); - } - - @Test(expected = ShardingJdbcException.class) - public void assertTracerClassError() { - when(System.getProperty("shardingjdbc.opentracing.tracer.class")).thenReturn("com.foo.FooTracer"); - ShardingJDBCTracer.get(); - - } - - private static void clearGlobalTracer() throws NoSuchFieldException, IllegalAccessException { - Field tracerField = GlobalTracer.class.getDeclaredField("tracer"); - tracerField.setAccessible(true); - tracerField.set(GlobalTracer.class, NoopTracerFactory.create()); - } + + @Before + public void setUp() throws Exception { + System.setProperty("shardingjdbc.opentracing.tracer.class", FooTracer.class.getName()); + clearGlobalTracer(); + } + + @After + public void tearDown() { + System.getProperties().remove("shardingjdbc.opentracing.tracer.class"); + } + + @Test + public void assertDuplicatedLoading() { + ShardingJDBCTracer.init(mock(Tracer.class)); + Tracer t1 = ShardingJDBCTracer.get(); + ShardingJDBCTracer.init(); + assertEquals(t1, ShardingJDBCTracer.get()); + ShardingJDBCTracer.init(mock(Tracer.class)); + assertEquals(t1, ShardingJDBCTracer.get()); + } + + @Test + public void assertTracer() { + assertThat((GlobalTracer) ShardingJDBCTracer.get(), isA(GlobalTracer.class)); + assertTrue(GlobalTracer.isRegistered()); + assertThat(ShardingJDBCTracer.get(), is(ShardingJDBCTracer.get())); + } + + @Test(expected = ShardingJdbcException.class) + public void assertTracerClassError() { + System.setProperty("shardingjdbc.opentracing.tracer.class", "com.foo.FooTracer"); + ShardingJDBCTracer.get(); + + } + + private static void clearGlobalTracer() throws NoSuchFieldException, IllegalAccessException { + Field tracerField = GlobalTracer.class.getDeclaredField("tracer"); + tracerField.setAccessible(true); + tracerField.set(GlobalTracer.class, NoopTracerFactory.create()); + } } diff --git a/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/config/ConfigurationLoaderTest.java b/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/config/ConfigurationLoaderTest.java index 3f76d97fd4b0d..226674c772045 100644 --- a/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/config/ConfigurationLoaderTest.java +++ b/sharding-opentracing/src/test/java/io/shardingjdbc/opentracing/config/ConfigurationLoaderTest.java @@ -18,29 +18,27 @@ package io.shardingjdbc.opentracing.config; import io.shardingjdbc.opentracing.fixture.FooTracer; +import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; -import static org.powermock.api.mockito.PowerMockito.mockStatic; -import static org.powermock.api.mockito.PowerMockito.when; -@RunWith(PowerMockRunner.class) -@PrepareForTest(OpentracingConfigurationParser.class) public final class ConfigurationLoaderTest { @Before public void setUp() { - mockStatic(System.class); + System.setProperty("shardingjdbc.opentracing.tracer.class",FooTracer.class.getName()); + } + + @After + public void tearDown() { + System.getProperties().remove("shardingjdbc.opentracing.tracer.class"); } @Test public void assertLoadConfigFromProperty() { - when(System.getProperty("shardingjdbc.opentracing.tracer.class")).thenReturn(FooTracer.class.getName()); assertThat(new ConfigurationLoader().getTracerClassName(), is(FooTracer.class.getName())); } diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/SQLExecuteBackendHandler.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/SQLExecuteBackendHandler.java index 5ee1a73343f79..74e6b61fd922a 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/SQLExecuteBackendHandler.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/SQLExecuteBackendHandler.java @@ -31,7 +31,7 @@ import io.shardingjdbc.core.routing.router.masterslave.MasterSlaveRouter; import io.shardingjdbc.core.routing.router.masterslave.MasterVisitedManager; import io.shardingjdbc.proxy.backend.mysql.MySQLPacketQueryResult; -import io.shardingjdbc.proxy.config.ShardingRuleRegistry; +import io.shardingjdbc.proxy.config.RuleRegistry; import io.shardingjdbc.proxy.transport.common.packet.DatabaseProtocolPacket; import io.shardingjdbc.proxy.transport.mysql.constant.ColumnType; import io.shardingjdbc.proxy.transport.mysql.constant.StatusFlag; @@ -96,11 +96,11 @@ public SQLExecuteBackendHandler(final String sql, final DatabaseType databaseTyp @Override public CommandResponsePackets execute() { - return ShardingRuleRegistry.getInstance().isOnlyMasterSlave() ? executeForMasterSlave() : executeForSharding(); + return RuleRegistry.getInstance().isOnlyMasterSlave() ? executeForMasterSlave() : executeForSharding(); } private CommandResponsePackets executeForMasterSlave() { - MasterSlaveRouter masterSlaveRouter = new MasterSlaveRouter(ShardingRuleRegistry.getInstance().getMasterSlaveRule()); + MasterSlaveRouter masterSlaveRouter = new MasterSlaveRouter(RuleRegistry.getInstance().getMasterSlaveRule()); SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge(); String dataSourceName = masterSlaveRouter.route(sqlStatement.getType()).iterator().next(); List result = new LinkedList<>(); @@ -109,7 +109,7 @@ private CommandResponsePackets executeForMasterSlave() { } private CommandResponsePackets executeForSharding() { - StatementRoutingEngine routingEngine = new StatementRoutingEngine(ShardingRuleRegistry.getInstance().getShardingRule(), ShardingRuleRegistry.getInstance().getShardingMetaData(), databaseType, showSQL); + StatementRoutingEngine routingEngine = new StatementRoutingEngine(RuleRegistry.getInstance().getShardingRule(), RuleRegistry.getInstance().getShardingMetaData(), databaseType, showSQL); SQLRouteResult routeResult = routingEngine.route(sql); if (routeResult.getExecutionUnits().isEmpty()) { return new CommandResponsePackets(new OKPacket(1, 0, 0, StatusFlag.SERVER_STATUS_AUTOCOMMIT.getValue(), 0, "")); @@ -126,13 +126,13 @@ private CommandResponsePackets execute(final SQLStatement sqlStatement, final St switch (sqlStatement.getType()) { case DQL: case DAL: - return executeQuery(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); + return executeQuery(RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); case DML: case DDL: - return ShardingRuleRegistry.getInstance().isOnlyMasterSlave() ? executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql) - : executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql, sqlStatement); + return RuleRegistry.getInstance().isOnlyMasterSlave() ? executeUpdate(RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql) + : executeUpdate(RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql, sqlStatement); default: - return executeCommon(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); + return executeCommon(RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); } } @@ -295,7 +295,7 @@ private CommandResponsePackets mergeDQLorDAL(final SQLStatement sqlStatement, fi queryResults.add(new MySQLPacketQueryResult(packets.get(i), resultSets.get(i))); } try { - mergedResult = MergeEngineFactory.newInstance(ShardingRuleRegistry.getInstance().getShardingRule(), queryResults, sqlStatement).merge(); + mergedResult = MergeEngineFactory.newInstance(RuleRegistry.getInstance().getShardingRule(), queryResults, sqlStatement).merge(); isMerged = true; } catch (final SQLException ex) { return new CommandResponsePackets(new ErrPacket(1, ex.getErrorCode(), "", ex.getSQLState(), ex.getMessage())); diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/StatementExecuteBackendHandler.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/StatementExecuteBackendHandler.java index ad97bf5c3810a..2e78dc8b3f5ee 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/StatementExecuteBackendHandler.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/StatementExecuteBackendHandler.java @@ -31,7 +31,7 @@ import io.shardingjdbc.core.routing.router.masterslave.MasterSlaveRouter; import io.shardingjdbc.core.routing.router.masterslave.MasterVisitedManager; import io.shardingjdbc.proxy.backend.mysql.MySQLPacketStatementExecuteQueryResult; -import io.shardingjdbc.proxy.config.ShardingRuleRegistry; +import io.shardingjdbc.proxy.config.RuleRegistry; import io.shardingjdbc.proxy.transport.common.packet.DatabaseProtocolPacket; import io.shardingjdbc.proxy.transport.mysql.constant.ColumnType; import io.shardingjdbc.proxy.transport.mysql.constant.StatusFlag; @@ -104,11 +104,11 @@ public StatementExecuteBackendHandler(final List pre @Override public CommandResponsePackets execute() { - return ShardingRuleRegistry.getInstance().isOnlyMasterSlave() ? executeForMasterSlave() : executeForSharding(); + return RuleRegistry.getInstance().isOnlyMasterSlave() ? executeForMasterSlave() : executeForSharding(); } private CommandResponsePackets executeForMasterSlave() { - MasterSlaveRouter masterSlaveRouter = new MasterSlaveRouter(ShardingRuleRegistry.getInstance().getMasterSlaveRule()); + MasterSlaveRouter masterSlaveRouter = new MasterSlaveRouter(RuleRegistry.getInstance().getMasterSlaveRule()); SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge(); String dataSourceName = masterSlaveRouter.route(sqlStatement.getType()).iterator().next(); List result = new LinkedList<>(); @@ -118,7 +118,7 @@ private CommandResponsePackets executeForMasterSlave() { private CommandResponsePackets executeForSharding() { PreparedStatementRoutingEngine routingEngine = new PreparedStatementRoutingEngine(sql, - ShardingRuleRegistry.getInstance().getShardingRule(), ShardingRuleRegistry.getInstance().getShardingMetaData(), databaseType, showSQL); + RuleRegistry.getInstance().getShardingRule(), RuleRegistry.getInstance().getShardingMetaData(), databaseType, showSQL); // TODO support null value parameter SQLRouteResult routeResult = routingEngine.route(getComStmtExecuteParameters()); if (routeResult.getExecutionUnits().isEmpty()) { @@ -136,13 +136,13 @@ private CommandResponsePackets execute(final SQLStatement sqlStatement, final St switch (sqlStatement.getType()) { case DQL: case DAL: - return executeQuery(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); + return executeQuery(RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); case DML: case DDL: - return ShardingRuleRegistry.getInstance().isOnlyMasterSlave() ? executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql) - : executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql, sqlStatement); + return RuleRegistry.getInstance().isOnlyMasterSlave() ? executeUpdate(RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql) + : executeUpdate(RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql, sqlStatement); default: - return executeCommon(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); + return executeCommon(RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); } } @@ -336,7 +336,7 @@ private CommandResponsePackets mergeDQLorDAL(final SQLStatement sqlStatement, fi queryResults.add(new MySQLPacketStatementExecuteQueryResult(packets.get(i), resultSets.get(i), columnTypes)); } try { - mergedResult = MergeEngineFactory.newInstance(ShardingRuleRegistry.getInstance().getShardingRule(), queryResults, sqlStatement).merge(); + mergedResult = MergeEngineFactory.newInstance(RuleRegistry.getInstance().getShardingRule(), queryResults, sqlStatement).merge(); isMerged = true; } catch (final SQLException ex) { return new CommandResponsePackets(new ErrPacket(1, ex.getErrorCode(), "", ex.getSQLState(), ex.getMessage())); diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/ShardingRuleRegistry.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/RuleRegistry.java similarity index 90% rename from sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/ShardingRuleRegistry.java rename to sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/RuleRegistry.java index e3b020a75defd..8fe8ef945f4a7 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/ShardingRuleRegistry.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/RuleRegistry.java @@ -31,7 +31,6 @@ import javax.sql.DataSource; import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; import java.sql.SQLException; import java.util.Collections; import java.util.HashMap; @@ -45,9 +44,9 @@ * @author panjuan */ @Getter -public final class ShardingRuleRegistry { +public final class RuleRegistry { - private static final ShardingRuleRegistry INSTANCE = new ShardingRuleRegistry(); + private static final RuleRegistry INSTANCE = new RuleRegistry(); private final Map dataSourceMap; @@ -59,11 +58,11 @@ public final class ShardingRuleRegistry { private final boolean isOnlyMasterSlave; - private ShardingRuleRegistry() { + private RuleRegistry() { YamlProxyConfiguration yamlProxyConfiguration; try { - yamlProxyConfiguration = YamlProxyConfiguration.unmarshal(new File(getClass().getResource("/conf/sharding-config.yaml").toURI().getPath())); - } catch (final IOException | URISyntaxException ex) { + yamlProxyConfiguration = YamlProxyConfiguration.unmarshal(new File(getClass().getResource("/conf/config.yaml").getFile())); + } catch (final IOException ex) { throw new ShardingJdbcException(ex); } dataSourceMap = new HashMap<>(128, 1); @@ -105,7 +104,7 @@ private DataSource getDataSource(final DataSourceParameter dataSourceParameter) * * @return instance of sharding rule registry */ - public static ShardingRuleRegistry getInstance() { + public static RuleRegistry getInstance() { return INSTANCE; } } diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/metadata/ProxyShardingMetaData.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/metadata/ProxyShardingMetaData.java index f15c666dbe77f..6fa346e011de3 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/metadata/ProxyShardingMetaData.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/metadata/ProxyShardingMetaData.java @@ -25,6 +25,7 @@ import lombok.RequiredArgsConstructor; import javax.sql.DataSource; +import java.sql.Connection; import java.sql.SQLException; import java.util.Collection; import java.util.Map; @@ -41,7 +42,7 @@ public final class ProxyShardingMetaData extends ShardingMetaData { private final Map dataSourceMap; @Override - protected Collection getColumnMetaDataList(final DataNode dataNode, final ShardingDataSourceNames shardingDataSourceNames) throws SQLException { + public Collection getColumnMetaDataList(final DataNode dataNode, final ShardingDataSourceNames shardingDataSourceNames) throws SQLException { return new ShardingMetaDataHandler(dataSourceMap.get(shardingDataSourceNames.getRawMasterDataSourceName(dataNode.getDataSourceName())), dataNode.getTableName()).getColumnMetaDataList(); } } diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/metadata/ShardingMetaDataHandler.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/metadata/ShardingMetaDataHandler.java index 5af54d39415b8..d436d903165f3 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/metadata/ShardingMetaDataHandler.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/metadata/ShardingMetaDataHandler.java @@ -26,7 +26,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.Collection; import java.util.LinkedList; import java.util.List; @@ -49,12 +48,28 @@ public final class ShardingMetaDataHandler { * @return column meta data list * @throws SQLException SQL exception */ - public Collection getColumnMetaDataList() throws SQLException { + public List getColumnMetaDataList() throws SQLException { List result = new LinkedList<>(); try (Connection connection = getDataSource().getConnection(); Statement statement = connection.createStatement()) { - statement.executeQuery(String.format("desc %s;", getActualTableName())); - ResultSet resultSet = statement.getResultSet(); + if (isTableExist(statement)) { + result = getExistColumnMeta(statement); + } + return result; + } + } + + private boolean isTableExist(final Statement statement) throws SQLException { + statement.executeQuery(String.format("show tables like '%s'", getActualTableName())); + try (ResultSet resultSet = statement.getResultSet()) { + return resultSet.next(); + } + } + + private List getExistColumnMeta(final Statement statement) throws SQLException { + List result = new LinkedList<>(); + statement.executeQuery(String.format("desc %s;", getActualTableName())); + try (ResultSet resultSet = statement.getResultSet()) { while (resultSet.next()) { result.add(new ColumnMetaData(resultSet.getString("Field"), resultSet.getString("Type"), resultSet.getString("Key"))); } diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/execute/ComStmtExecutePacket.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/execute/ComStmtExecutePacket.java index c126d03c7e1b8..068dcab197c38 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/execute/ComStmtExecutePacket.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/execute/ComStmtExecutePacket.java @@ -22,7 +22,7 @@ import io.shardingjdbc.core.parsing.SQLParsingEngine; import io.shardingjdbc.core.parsing.parser.sql.SQLStatement; import io.shardingjdbc.proxy.backend.common.StatementExecuteBackendHandler; -import io.shardingjdbc.proxy.config.ShardingRuleRegistry; +import io.shardingjdbc.proxy.config.RuleRegistry; import io.shardingjdbc.proxy.transport.common.packet.DatabaseProtocolPacket; import io.shardingjdbc.proxy.transport.mysql.constant.ColumnType; import io.shardingjdbc.proxy.transport.mysql.constant.NewParametersBoundFlag; @@ -73,7 +73,7 @@ public ComStmtExecutePacket(final int sequenceId, final MySQLPacketPayload mysql flags = mysqlPacketPayload.readInt1(); Preconditions.checkArgument(iterationCount == mysqlPacketPayload.readInt4()); SQLStatement sqlStatement = new SQLParsingEngine(DatabaseType.MySQL, PreparedStatementRegistry.getInstance().getSQL(statementId), - ShardingRuleRegistry.getInstance().getShardingRule(), null).parse(true); + RuleRegistry.getInstance().getShardingRule(), null).parse(true); int numParameters = sqlStatement.getParametersIndex(); nullBitmap = new NullBitmap(numParameters, RESERVED_BIT_LENGTH); for (int i = 0; i < nullBitmap.getNullBitmap().length; i++) { diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/prepare/ComStmtPreparePacket.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/prepare/ComStmtPreparePacket.java index 3004be3b17d23..ea2af92d47ea8 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/prepare/ComStmtPreparePacket.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/prepare/ComStmtPreparePacket.java @@ -23,7 +23,7 @@ import io.shardingjdbc.core.parsing.parser.sql.SQLStatement; import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement; import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement; -import io.shardingjdbc.proxy.config.ShardingRuleRegistry; +import io.shardingjdbc.proxy.config.RuleRegistry; import io.shardingjdbc.proxy.transport.common.packet.DatabaseProtocolPacket; import io.shardingjdbc.proxy.transport.mysql.constant.ColumnType; import io.shardingjdbc.proxy.transport.mysql.constant.StatusFlag; @@ -61,7 +61,7 @@ public CommandResponsePackets execute() { log.debug("COM_STMT_PREPARE received for Sharding-Proxy: {}", sql); CommandResponsePackets result = new CommandResponsePackets(); int currentSequenceId = 0; - SQLStatement sqlStatement = new SQLParsingEngine(DatabaseType.MySQL, sql, ShardingRuleRegistry.getInstance().getShardingRule(), null).parse(true); + SQLStatement sqlStatement = new SQLParsingEngine(DatabaseType.MySQL, sql, RuleRegistry.getInstance().getShardingRule(), null).parse(true); int parametersIndex = sqlStatement.getParametersIndex(); result.addPacket(new ComStmtPrepareOKPacket(++currentSequenceId, PreparedStatementRegistry.getInstance().register(sql), getNumColumns(sqlStatement), parametersIndex, 0)); for (int i = 0; i < parametersIndex; i++) { diff --git a/sharding-proxy/src/main/resources/conf/config.yaml b/sharding-proxy/src/main/resources/conf/config.yaml new file mode 100644 index 0000000000000..f1f63f1a90b09 --- /dev/null +++ b/sharding-proxy/src/main/resources/conf/config.yaml @@ -0,0 +1,70 @@ +################## ################## +# Here you can configure the rules for the proxy. +# +# We provide two kinds of configurations for example. The one is the configuration of Sharding rule, +# and the other is the configuration of master-slave rule. +# If you want to use Sharding, please refer to the first one, and if you only want to use master-slave, +# please refer to the second one. +# +################## ################## + + +# The example of Sharding rule. + +#dataSources: +# demo_ds_0: +# url: jdbc:mysql://127.0.0.1:3306/demo_ds_0 +# username: root +# password: +# demo_ds_1: +# url: jdbc:mysql://127.0.0.1:3306/demo_ds_1 +# username: root +# password: +# +#shardingRule: +# tables: +# t_order: +# actualDataNodes: demo_ds_${0..1}.t_order_${0..1} +# tableStrategy: +# inline: +# shardingColumn: order_id +# algorithmExpression: t_order_${order_id % 2} +# keyGeneratorColumnName: order_id +# t_order_item: +# actualDataNodes: demo_ds_${0..1}.t_order_item_${0..1} +# tableStrategy: +# inline: +# shardingColumn: order_id +# algorithmExpression: t_order_item_${order_id % 2} +# bindingTables: +# - t_order,t_order_item +# defaultDatabaseStrategy: +# inline: +# shardingColumn: user_id +# algorithmExpression: demo_ds_${user_id % 2} +# defaultTableStrategy: +# none: +# defaultKeyGeneratorClassName: io.shardingjdbc.core.keygen.DefaultKeyGenerator +# +# props: +# sql.show: true + + + +# The example of master-slave rule. + +#dataSources: +# demo_ds_0: +# url: jdbc:mysql://127.0.0.1:3306/demo_ds_0 +# username: root +# password: +# demo_ds_1: +# url: jdbc:mysql://127.0.0.1:3306/demo_ds_1 +# username: root +# password: +#masterSlaveRule: +# name: ds_ms +# masterDataSourceName: demo_ds_0 +# slaveDataSourceNames: +# - demo_ds_1 + diff --git a/sharding-proxy/src/main/resources/conf/sharding-config.yaml b/sharding-proxy/src/main/resources/conf/sharding-config.yaml deleted file mode 100644 index 575a8e0627cdf..0000000000000 --- a/sharding-proxy/src/main/resources/conf/sharding-config.yaml +++ /dev/null @@ -1,37 +0,0 @@ -dataSources: - demo_ds_0: - url: jdbc:mysql://localhost:3306/demo_ds_0 - username: root - password: - demo_ds_1: - url: jdbc:mysql://localhost:3306/demo_ds_1 - username: root - password: - -shardingRule: - tables: - t_order: - actualDataNodes: demo_ds_${0..1}.t_order_${0..1} - tableStrategy: - inline: - shardingColumn: order_id - algorithmExpression: t_order_${order_id % 2} - keyGeneratorColumnName: order_id - t_order_item: - actualDataNodes: demo_ds_${0..1}.t_order_item_${0..1} - tableStrategy: - inline: - shardingColumn: order_id - algorithmExpression: t_order_item_${order_id % 2} - bindingTables: - - t_order,t_order_item - defaultDatabaseStrategy: - inline: - shardingColumn: user_id - algorithmExpression: demo_ds_${user_id % 2} - defaultTableStrategy: - none: - defaultKeyGeneratorClassName: io.shardingjdbc.core.keygen.DefaultKeyGenerator - - props: - sql.show: true