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