From 1367542c224af72a89ad69a57790f356d8a03714 Mon Sep 17 00:00:00 2001 From: terrymanu Date: Wed, 1 Aug 2018 15:37:45 +0800 Subject: [PATCH] add TableMetaDataExecutorAdapter --- .../metadata/table/ShardingTableMetaData.java | 94 ++++++++++--------- .../table/TableMetaDataExecutorAdapter.java | 44 +++++++++ .../core/datasource/ShardingDataSource.java | 6 +- .../statement/ShardingPreparedStatement.java | 6 +- .../core/statement/ShardingStatement.java | 6 +- ...losedJDBCTableMetaDataExecutorAdapter.java | 47 ++++++++++ ...nHoldJDBCTableMetaDataExecutorAdapter.java | 45 +++++++++ .../metadata/JDBCShardingTableMetaData.java | 69 -------------- .../connection/ShardingConnectionTest.java | 4 +- .../proxy/config/RuleRegistry.java | 4 +- .../metadata/ProxyShardingTableMetaData.java | 57 ----------- .../ProxyTableMetaDataExecutorAdapter.java | 46 +++++++++ 12 files changed, 247 insertions(+), 181 deletions(-) create mode 100644 sharding-core/src/main/java/io/shardingsphere/core/metadata/table/TableMetaDataExecutorAdapter.java create mode 100644 sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/AutoClosedJDBCTableMetaDataExecutorAdapter.java create mode 100644 sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/ConnectionHoldJDBCTableMetaDataExecutorAdapter.java delete mode 100644 sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/JDBCShardingTableMetaData.java delete mode 100644 sharding-proxy/src/main/java/io/shardingsphere/proxy/metadata/ProxyShardingTableMetaData.java create mode 100644 sharding-proxy/src/main/java/io/shardingsphere/proxy/metadata/ProxyTableMetaDataExecutorAdapter.java diff --git a/sharding-core/src/main/java/io/shardingsphere/core/metadata/table/ShardingTableMetaData.java b/sharding-core/src/main/java/io/shardingsphere/core/metadata/table/ShardingTableMetaData.java index 03164541afec3..2aee76272f52a 100644 --- a/sharding-core/src/main/java/io/shardingsphere/core/metadata/table/ShardingTableMetaData.java +++ b/sharding-core/src/main/java/io/shardingsphere/core/metadata/table/ShardingTableMetaData.java @@ -26,7 +26,8 @@ import io.shardingsphere.core.rule.ShardingDataSourceNames; import io.shardingsphere.core.rule.ShardingRule; import io.shardingsphere.core.rule.TableRule; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import lombok.Setter; import java.sql.Connection; import java.sql.ResultSet; @@ -48,13 +49,16 @@ * @author zhaojun * @author zhangliang */ -@RequiredArgsConstructor -public abstract class ShardingTableMetaData { +@AllArgsConstructor +public class ShardingTableMetaData { private final ListeningExecutorService executorService; private final Map tableMetaDataMap = new HashMap<>(); + @Setter + private TableMetaDataExecutorAdapter executorAdapter; + /** * Initialize sharding meta data. * @@ -86,7 +90,7 @@ private void initDefaultTables(final ShardingRule shardingRule) throws SQLExcept private Collection getAllTableNames(final String dataSourceName) throws SQLException { Collection result = new LinkedList<>(); - try (Connection connection = getConnection(dataSourceName); + try (Connection connection = executorAdapter.getConnection(dataSourceName); ResultSet resultSet = connection.getMetaData().getTables(null, null, null, null)) { while (resultSet.next()) { result.add(resultSet.getString("TABLE_NAME")); @@ -95,8 +99,6 @@ private Collection getAllTableNames(final String dataSourceName) throws return result; } - protected abstract Connection getConnection(String dataSourceName) throws SQLException; - /** * Refresh table meta data. * @@ -104,62 +106,35 @@ private Collection getAllTableNames(final String dataSourceName) throws * @param shardingRule sharding rule */ public void refresh(final String logicTableName, final ShardingRule shardingRule) { - refresh(logicTableName, shardingRule, Collections.emptyMap()); + tableMetaDataMap.put(logicTableName, loadTableMetaData(shardingRule.getTableRule(logicTableName), shardingRule.getShardingDataSourceNames())); } - /** - * Refresh table meta data. - * - * @param logicTableName logic table name - * @param shardingRule sharding rule - * @param connectionMap connection map passing from sharding connection - */ - public void refresh(final String logicTableName, final ShardingRule shardingRule, final Map connectionMap) { - tableMetaDataMap.put(logicTableName, loadTableMetaData(shardingRule.getTableRule(logicTableName), shardingRule.getShardingDataSourceNames(), connectionMap)); - } - - private TableMetaData loadTableMetaData(final TableRule tableRule, final ShardingDataSourceNames shardingDataSourceNames, final Map connectionMap) { - List actualTableMetaDataList = loadActualTableMetaDataList(tableRule.getActualDataNodes(), shardingDataSourceNames, connectionMap); + private TableMetaData loadTableMetaData(final TableRule tableRule, final ShardingDataSourceNames shardingDataSourceNames) { + List actualTableMetaDataList = loadActualTableMetaDataList(tableRule.getActualDataNodes(), shardingDataSourceNames); checkUniformed(tableRule.getLogicTable(), actualTableMetaDataList); return actualTableMetaDataList.iterator().next(); } - protected abstract TableMetaData loadTableMetaData(DataNode dataNode, Map connectionMap) throws SQLException; - - private List loadActualTableMetaDataList(final List actualDataNodes, final ShardingDataSourceNames shardingDataSourceNames, final Map connectionMap) { - List> result = new LinkedList<>(); - for (final DataNode each : actualDataNodes) { - result.add(executorService.submit(new Callable() { - - @Override - public TableMetaData call() throws SQLException { - return loadTableMetaData(new DataNode(shardingDataSourceNames.getRawMasterDataSourceName(each.getDataSourceName()), each.getTableName()), connectionMap); - } - })); - } - try { - return Futures.allAsList(result).get(); - } catch (final InterruptedException | ExecutionException ex) { - throw new ShardingException(ex); + private TableMetaData loadTableMetaData(final DataNode dataNode) throws SQLException { + if (executorAdapter.isAutoClose()) { + try (Connection connection = executorAdapter.getConnection(dataNode.getDataSourceName())) { + return loadTableMetaData(connection, dataNode); + } } + return loadTableMetaData(executorAdapter.getConnection(dataNode.getDataSourceName()), dataNode); } - private void checkUniformed(final String logicTableName, final List actualTableMetaDataList) { - final TableMetaData sample = actualTableMetaDataList.iterator().next(); - for (TableMetaData each : actualTableMetaDataList) { - if (!sample.equals(each)) { - throw new ShardingException("Cannot get uniformed table structure for `%s`. The different meta data of actual tables are as follows:\n%s\n%s.", logicTableName, sample, each); - } - } + private TableMetaData loadTableMetaData(final Connection connection, final DataNode dataNode) throws SQLException { + return new TableMetaData(isTableExist(connection, dataNode.getTableName()) ? getColumnMetaDataList(connection, dataNode.getTableName()) : Collections.emptyList()); } - protected boolean isTableExist(final Connection connection, final String actualTableName) throws SQLException { + private boolean isTableExist(final Connection connection, final String actualTableName) throws SQLException { try (ResultSet resultSet = connection.getMetaData().getTables(null, null, actualTableName, null)) { return resultSet.next(); } } - protected List getColumnMetaDataList(final Connection connection, final String actualTableName) throws SQLException { + private List getColumnMetaDataList(final Connection connection, final String actualTableName) throws SQLException { List result = new LinkedList<>(); Collection primaryKeys = getPrimaryKeys(connection, actualTableName); try (ResultSet resultSet = connection.getMetaData().getColumns(null, null, actualTableName, null)) { @@ -182,6 +157,33 @@ private Collection getPrimaryKeys(final Connection connection, final Str return result; } + private List loadActualTableMetaDataList(final List actualDataNodes, final ShardingDataSourceNames shardingDataSourceNames) { + List> result = new LinkedList<>(); + for (final DataNode each : actualDataNodes) { + result.add(executorService.submit(new Callable() { + + @Override + public TableMetaData call() throws SQLException { + return loadTableMetaData(new DataNode(shardingDataSourceNames.getRawMasterDataSourceName(each.getDataSourceName()), each.getTableName())); + } + })); + } + try { + return Futures.allAsList(result).get(); + } catch (final InterruptedException | ExecutionException ex) { + throw new ShardingException(ex); + } + } + + private void checkUniformed(final String logicTableName, final List actualTableMetaDataList) { + final TableMetaData sample = actualTableMetaDataList.iterator().next(); + for (TableMetaData each : actualTableMetaDataList) { + if (!sample.equals(each)) { + throw new ShardingException("Cannot get uniformed table structure for `%s`. The different meta data of actual tables are as follows:\n%s\n%s.", logicTableName, sample, each); + } + } + } + /** * Judge contains table from table meta data or not. * diff --git a/sharding-core/src/main/java/io/shardingsphere/core/metadata/table/TableMetaDataExecutorAdapter.java b/sharding-core/src/main/java/io/shardingsphere/core/metadata/table/TableMetaDataExecutorAdapter.java new file mode 100644 index 0000000000000..016ae64717516 --- /dev/null +++ b/sharding-core/src/main/java/io/shardingsphere/core/metadata/table/TableMetaDataExecutorAdapter.java @@ -0,0 +1,44 @@ +/* + * Copyright 2016-2018 shardingsphere.io. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package io.shardingsphere.core.metadata.table; + +import java.sql.Connection; +import java.sql.SQLException; + +/** + * Table meta data executor adapter. + * + * @author zhangliang + */ +public interface TableMetaDataExecutorAdapter { + + /** + * Get connection. + * + * @param dataSourceName data source name + * @return connection + * @throws SQLException SQL exception + */ + Connection getConnection(String dataSourceName) throws SQLException; + + /** + * Is auto close created connection or not. + * @return auto close or not + */ + boolean isAutoClose(); +} diff --git a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/datasource/ShardingDataSource.java b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/datasource/ShardingDataSource.java index e0c60031a5d59..0dadbfb4c0931 100644 --- a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/datasource/ShardingDataSource.java +++ b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/datasource/ShardingDataSource.java @@ -26,7 +26,7 @@ import io.shardingsphere.core.jdbc.adapter.AbstractDataSourceAdapter; import io.shardingsphere.core.jdbc.core.ShardingContext; import io.shardingsphere.core.jdbc.core.connection.ShardingConnection; -import io.shardingsphere.core.jdbc.metadata.JDBCShardingTableMetaData; +import io.shardingsphere.core.jdbc.metadata.AutoClosedJDBCTableMetaDataExecutorAdapter; import io.shardingsphere.core.metadata.table.ShardingTableMetaData; import io.shardingsphere.core.rule.MasterSlaveRule; import io.shardingsphere.core.rule.ShardingRule; @@ -68,7 +68,7 @@ public ShardingDataSource(final Map dataSourceMap, final Sha shardingProperties = new ShardingProperties(null == props ? new Properties() : props); int executorSize = shardingProperties.getValue(ShardingPropertiesConstant.EXECUTOR_SIZE); executorEngine = new ExecutorEngine(executorSize); - ShardingTableMetaData shardingTableMetaData = new JDBCShardingTableMetaData(executorEngine.getExecutorService(), dataSourceMap); + ShardingTableMetaData shardingTableMetaData = new ShardingTableMetaData(executorEngine.getExecutorService(), new AutoClosedJDBCTableMetaDataExecutorAdapter(dataSourceMap)); shardingTableMetaData.init(shardingRule); boolean showSQL = shardingProperties.getValue(ShardingPropertiesConstant.SQL_SHOW); shardingContext = new ShardingContext(dataSourceMap, shardingRule, getDatabaseType(), executorEngine, shardingTableMetaData, showSQL); @@ -91,7 +91,7 @@ public void renew(final Map newDataSourceMap, final Sharding originalExecutorEngine.close(); } boolean newShowSQL = newShardingProperties.getValue(ShardingPropertiesConstant.SQL_SHOW); - ShardingTableMetaData shardingMetaData = new JDBCShardingTableMetaData(executorEngine.getExecutorService(), newDataSourceMap); + ShardingTableMetaData shardingMetaData = new ShardingTableMetaData(executorEngine.getExecutorService(), new AutoClosedJDBCTableMetaDataExecutorAdapter(newDataSourceMap)); shardingMetaData.init(newShardingRule); shardingProperties = newShardingProperties; shardingContext = new ShardingContext(newDataSourceMap, newShardingRule, getDatabaseType(), executorEngine, shardingMetaData, newShowSQL); diff --git a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/statement/ShardingPreparedStatement.java b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/statement/ShardingPreparedStatement.java index f8bb8ce1b2f2a..fea0d2678b34c 100644 --- a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/statement/ShardingPreparedStatement.java +++ b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/statement/ShardingPreparedStatement.java @@ -30,6 +30,7 @@ import io.shardingsphere.core.jdbc.core.connection.ShardingConnection; import io.shardingsphere.core.jdbc.core.resultset.GeneratedKeysResultSet; import io.shardingsphere.core.jdbc.core.resultset.ShardingResultSet; +import io.shardingsphere.core.jdbc.metadata.ConnectionHoldJDBCTableMetaDataExecutorAdapter; import io.shardingsphere.core.merger.JDBCQueryResult; import io.shardingsphere.core.merger.MergeEngine; import io.shardingsphere.core.merger.MergeEngineFactory; @@ -37,6 +38,7 @@ import io.shardingsphere.core.merger.QueryResult; import io.shardingsphere.core.merger.event.EventMergeType; import io.shardingsphere.core.merger.event.ResultSetMergeEvent; +import io.shardingsphere.core.metadata.table.ShardingTableMetaData; import io.shardingsphere.core.parsing.parser.sql.dal.DALStatement; import io.shardingsphere.core.parsing.parser.sql.dml.insert.InsertStatement; import io.shardingsphere.core.parsing.parser.sql.dql.DQLStatement; @@ -212,7 +214,9 @@ private void sqlRoute() { private void refreshTableMetaData() throws SQLException { if (null != routeResult && null != connection && SQLType.DDL == routeResult.getSqlStatement().getType() && !routeResult.getSqlStatement().getTables().isEmpty()) { String logicTableName = routeResult.getSqlStatement().getTables().getSingleTableName(); - connection.getShardingContext().getMetaData().getTable().refresh(logicTableName, connection.getShardingContext().getShardingRule(), connection.getConnections(logicTableName)); + ShardingTableMetaData shardingTableMetaData = connection.getShardingContext().getMetaData().getTable(); + shardingTableMetaData.setExecutorAdapter(new ConnectionHoldJDBCTableMetaDataExecutorAdapter(connection.getConnections(logicTableName))); + shardingTableMetaData.refresh(logicTableName, connection.getShardingContext().getShardingRule()); } } diff --git a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/statement/ShardingStatement.java b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/statement/ShardingStatement.java index 84e93c870449f..97bf3931bf1af 100644 --- a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/statement/ShardingStatement.java +++ b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/core/statement/ShardingStatement.java @@ -26,6 +26,7 @@ import io.shardingsphere.core.jdbc.core.connection.ShardingConnection; import io.shardingsphere.core.jdbc.core.resultset.GeneratedKeysResultSet; import io.shardingsphere.core.jdbc.core.resultset.ShardingResultSet; +import io.shardingsphere.core.jdbc.metadata.ConnectionHoldJDBCTableMetaDataExecutorAdapter; import io.shardingsphere.core.merger.JDBCQueryResult; import io.shardingsphere.core.merger.MergeEngine; import io.shardingsphere.core.merger.MergeEngineFactory; @@ -33,6 +34,7 @@ import io.shardingsphere.core.merger.QueryResult; import io.shardingsphere.core.merger.event.EventMergeType; import io.shardingsphere.core.merger.event.ResultSetMergeEvent; +import io.shardingsphere.core.metadata.table.ShardingTableMetaData; import io.shardingsphere.core.parsing.parser.sql.dal.DALStatement; import io.shardingsphere.core.parsing.parser.sql.dml.insert.InsertStatement; import io.shardingsphere.core.parsing.parser.sql.dql.DQLStatement; @@ -246,7 +248,9 @@ private void sqlRoute(final String sql) { private void refreshTableMetaData() throws SQLException { if (null != routeResult && null != connection && SQLType.DDL == routeResult.getSqlStatement().getType() && !routeResult.getSqlStatement().getTables().isEmpty()) { String logicTableName = routeResult.getSqlStatement().getTables().getSingleTableName(); - connection.getShardingContext().getMetaData().getTable().refresh(logicTableName, connection.getShardingContext().getShardingRule(), connection.getConnections(logicTableName)); + ShardingTableMetaData shardingTableMetaData = connection.getShardingContext().getMetaData().getTable(); + shardingTableMetaData.setExecutorAdapter(new ConnectionHoldJDBCTableMetaDataExecutorAdapter(connection.getConnections(logicTableName))); + shardingTableMetaData.refresh(logicTableName, connection.getShardingContext().getShardingRule()); } } diff --git a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/AutoClosedJDBCTableMetaDataExecutorAdapter.java b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/AutoClosedJDBCTableMetaDataExecutorAdapter.java new file mode 100644 index 0000000000000..43eee038303cb --- /dev/null +++ b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/AutoClosedJDBCTableMetaDataExecutorAdapter.java @@ -0,0 +1,47 @@ +/* + * Copyright 2016-2018 shardingsphere.io. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package io.shardingsphere.core.jdbc.metadata; + +import io.shardingsphere.core.metadata.table.TableMetaDataExecutorAdapter; +import lombok.RequiredArgsConstructor; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Map; + +/** + * Table meta data executor adapter for JDBC and auto closed. + * + * @author zhangliang + */ +@RequiredArgsConstructor +public final class AutoClosedJDBCTableMetaDataExecutorAdapter implements TableMetaDataExecutorAdapter { + + private final Map dataSourceMap; + + @Override + public Connection getConnection(final String dataSourceName) throws SQLException { + return dataSourceMap.get(dataSourceName).getConnection(); + } + + @Override + public boolean isAutoClose() { + return true; + } +} diff --git a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/ConnectionHoldJDBCTableMetaDataExecutorAdapter.java b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/ConnectionHoldJDBCTableMetaDataExecutorAdapter.java new file mode 100644 index 0000000000000..e50b51e39bc13 --- /dev/null +++ b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/ConnectionHoldJDBCTableMetaDataExecutorAdapter.java @@ -0,0 +1,45 @@ +/* + * Copyright 2016-2018 shardingsphere.io. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package io.shardingsphere.core.jdbc.metadata; + +import io.shardingsphere.core.metadata.table.TableMetaDataExecutorAdapter; +import lombok.RequiredArgsConstructor; + +import java.sql.Connection; +import java.util.Map; + +/** + * Table meta data executor adapter for JDBC and connection hold by creator. + * + * @author zhangliang + */ +@RequiredArgsConstructor +public final class ConnectionHoldJDBCTableMetaDataExecutorAdapter implements TableMetaDataExecutorAdapter { + + private final Map connectionMap; + + @Override + public Connection getConnection(final String dataSourceName) { + return connectionMap.get(dataSourceName); + } + + @Override + public boolean isAutoClose() { + return false; + } +} diff --git a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/JDBCShardingTableMetaData.java b/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/JDBCShardingTableMetaData.java deleted file mode 100644 index c72062b39cf73..0000000000000 --- a/sharding-jdbc/src/main/java/io/shardingsphere/core/jdbc/metadata/JDBCShardingTableMetaData.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2016-2018 shardingsphere.io. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- */ - -package io.shardingsphere.core.jdbc.metadata; - -import com.google.common.util.concurrent.ListeningExecutorService; -import io.shardingsphere.core.metadata.table.ColumnMetaData; -import io.shardingsphere.core.metadata.table.ShardingTableMetaData; -import io.shardingsphere.core.metadata.table.TableMetaData; -import io.shardingsphere.core.rule.DataNode; - -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Collections; -import java.util.Map; - -/** - * Sharding table meta data for JDBC. - * - * @author panjuan - * @author zhangliang - */ -public final class JDBCShardingTableMetaData extends ShardingTableMetaData { - - private final Map dataSourceMap; - - public JDBCShardingTableMetaData(final ListeningExecutorService executorService, final Map dataSourceMap) { - super(executorService); - this.dataSourceMap = dataSourceMap; - } - - @Override - protected Connection getConnection(final String dataSourceName) throws SQLException { - return dataSourceMap.get(dataSourceName).getConnection(); - } - - @Override - public TableMetaData loadTableMetaData(final DataNode dataNode, final Map connectionMap) throws SQLException { - if (connectionMap.containsKey(dataNode.getDataSourceName())) { - return getTableMetaData(connectionMap.get(dataNode.getDataSourceName()), dataNode.getTableName()); - } - return getTableMetaData(dataSourceMap.get(dataNode.getDataSourceName()), dataNode.getTableName()); - } - - private TableMetaData getTableMetaData(final Connection connection, final String actualTableName) throws SQLException { - return new TableMetaData(isTableExist(connection, actualTableName) ? getColumnMetaDataList(connection, actualTableName) : Collections.emptyList()); - } - - private TableMetaData getTableMetaData(final DataSource dataSource, final String actualTableName) throws SQLException { - try (Connection connection = dataSource.getConnection()) { - return getTableMetaData(connection, actualTableName); - } - } -} diff --git a/sharding-jdbc/src/test/java/io/shardingsphere/core/jdbc/core/connection/ShardingConnectionTest.java b/sharding-jdbc/src/test/java/io/shardingsphere/core/jdbc/core/connection/ShardingConnectionTest.java index d44a0b07c4ef4..491c1146bd489 100644 --- a/sharding-jdbc/src/test/java/io/shardingsphere/core/jdbc/core/connection/ShardingConnectionTest.java +++ b/sharding-jdbc/src/test/java/io/shardingsphere/core/jdbc/core/connection/ShardingConnectionTest.java @@ -25,7 +25,7 @@ import io.shardingsphere.core.fixture.TestDataSource; import io.shardingsphere.core.jdbc.core.ShardingContext; import io.shardingsphere.core.jdbc.core.datasource.MasterSlaveDataSource; -import io.shardingsphere.core.jdbc.metadata.JDBCShardingTableMetaData; +import io.shardingsphere.core.jdbc.metadata.AutoClosedJDBCTableMetaDataExecutorAdapter; import io.shardingsphere.core.metadata.table.ShardingTableMetaData; import io.shardingsphere.core.rule.ShardingRule; import org.junit.After; @@ -75,7 +75,7 @@ public void setUp() { dataSourceMap.put(DS_NAME, masterSlaveDataSource); ShardingRule shardingRule = new ShardingRule(shardingRuleConfig, dataSourceMap.keySet()); ListeningExecutorService executorService = Mockito.mock(ListeningExecutorService.class); - ShardingTableMetaData shardingTableMetaData = new JDBCShardingTableMetaData(executorService, dataSourceMap); + ShardingTableMetaData shardingTableMetaData = new ShardingTableMetaData(executorService, new AutoClosedJDBCTableMetaDataExecutorAdapter(dataSourceMap)); ShardingContext shardingContext = new ShardingContext(dataSourceMap, shardingRule, DatabaseType.H2, null, shardingTableMetaData, false); connection = new ShardingConnection(shardingContext); } diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/config/RuleRegistry.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/config/RuleRegistry.java index f768b7c4cc48a..771bc956b85b1 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/config/RuleRegistry.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/config/RuleRegistry.java @@ -36,7 +36,7 @@ import io.shardingsphere.jdbc.orchestration.internal.eventbus.ProxyEventBusEvent; import io.shardingsphere.proxy.backend.constant.ProxyMode; import io.shardingsphere.proxy.backend.jdbc.datasource.JDBCBackendDataSource; -import io.shardingsphere.proxy.metadata.ProxyShardingTableMetaData; +import io.shardingsphere.proxy.metadata.ProxyTableMetaDataExecutorAdapter; import io.shardingsphere.proxy.util.ProxyTransactionLoader; import lombok.AccessLevel; import lombok.Getter; @@ -134,7 +134,7 @@ public synchronized void init(final OrchestrationProxyConfiguration config) { */ public void initShardingMetaData(final ExecutorService executorService) { ShardingDataSourceMetaData shardingDataSourceMetaData = new ShardingDataSourceMetaData(getDataSourceURLs(dataSourceConfigurationMap), shardingRule, DatabaseType.MySQL); - ShardingTableMetaData shardingTableMetaData = new ProxyShardingTableMetaData(MoreExecutors.listeningDecorator(executorService), backendDataSource); + ShardingTableMetaData shardingTableMetaData = new ShardingTableMetaData(MoreExecutors.listeningDecorator(executorService), new ProxyTableMetaDataExecutorAdapter(backendDataSource)); if (!isMasterSlaveOnly()) { shardingTableMetaData.init(shardingRule); } diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/metadata/ProxyShardingTableMetaData.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/metadata/ProxyShardingTableMetaData.java deleted file mode 100644 index 0dbdf3341b947..0000000000000 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/metadata/ProxyShardingTableMetaData.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2016-2018 shardingsphere.io. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- */ - -package io.shardingsphere.proxy.metadata; - -import com.google.common.util.concurrent.ListeningExecutorService; -import io.shardingsphere.core.metadata.table.ColumnMetaData; -import io.shardingsphere.core.metadata.table.ShardingTableMetaData; -import io.shardingsphere.core.metadata.table.TableMetaData; -import io.shardingsphere.core.rule.DataNode; -import io.shardingsphere.proxy.backend.jdbc.datasource.JDBCBackendDataSource; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Collections; -import java.util.Map; - -/** - * Sharding table meta data for proxy. - * - * @author panjuan - */ -public final class ProxyShardingTableMetaData extends ShardingTableMetaData { - - private final JDBCBackendDataSource backendDataSource; - - public ProxyShardingTableMetaData(final ListeningExecutorService executorService, final JDBCBackendDataSource backendDataSource) { - super(executorService); - this.backendDataSource = backendDataSource; - } - - @Override - protected Connection getConnection(final String dataSourceName) throws SQLException { - return backendDataSource.getDataSource(dataSourceName).getConnection(); - } - - @Override - public TableMetaData loadTableMetaData(final DataNode dataNode, final Map connectionMap) throws SQLException { - try (Connection connection = backendDataSource.getDataSource(dataNode.getDataSourceName()).getConnection()) { - return new TableMetaData(isTableExist(connection, dataNode.getTableName()) ? getColumnMetaDataList(connection, dataNode.getTableName()) : Collections.emptyList()); - } - } -} diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/metadata/ProxyTableMetaDataExecutorAdapter.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/metadata/ProxyTableMetaDataExecutorAdapter.java new file mode 100644 index 0000000000000..74bfbe03d281a --- /dev/null +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/metadata/ProxyTableMetaDataExecutorAdapter.java @@ -0,0 +1,46 @@ +/* + * Copyright 2016-2018 shardingsphere.io. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package io.shardingsphere.proxy.metadata; + +import io.shardingsphere.core.metadata.table.TableMetaDataExecutorAdapter; +import io.shardingsphere.proxy.backend.jdbc.datasource.JDBCBackendDataSource; +import lombok.RequiredArgsConstructor; + +import java.sql.Connection; +import java.sql.SQLException; + +/** + * Table meta data executor adapter for proxy. + * + * @author zhangliang + */ +@RequiredArgsConstructor +public final class ProxyTableMetaDataExecutorAdapter implements TableMetaDataExecutorAdapter { + + private final JDBCBackendDataSource backendDataSource; + + @Override + public Connection getConnection(final String dataSourceName) throws SQLException { + return backendDataSource.getDataSource(dataSourceName).getConnection(); + } + + @Override + public boolean isAutoClose() { + return true; + } +}