提交 55126fe9 编写于 作者: T terrymanu

refactor getProductDataBaseName

上级 d1a24df0
......@@ -28,8 +28,11 @@ import com.dangdang.ddframe.rdb.sharding.metrics.MetricsContext;
import com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine;
import com.google.common.base.Preconditions;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;
/**
......@@ -39,10 +42,10 @@ import java.util.Properties;
*/
public class ShardingDataSource extends AbstractDataSourceAdapter {
private final ShardingContext shardingContext;
private final ShardingProperties shardingProperties;
private final ShardingContext shardingContext;
public ShardingDataSource(final ShardingRule shardingRule) {
this(shardingRule, new Properties());
}
......@@ -51,13 +54,27 @@ public class ShardingDataSource extends AbstractDataSourceAdapter {
Preconditions.checkNotNull(shardingRule);
Preconditions.checkNotNull(props);
shardingProperties = new ShardingProperties(props);
DatabaseType type;
try {
type = DatabaseType.valueFrom(ShardingConnection.getDatabaseMetaDataFromDataSource(shardingRule.getDataSourceRule().getDataSources()).getDatabaseProductName());
} catch (final SQLException ex) {
throw new ShardingJdbcException("Can not get database product name", ex);
shardingContext = new ShardingContext(shardingRule, new SQLRouteEngine(shardingRule, DatabaseType.valueFrom(getDatabaseProductName(shardingRule))), new ExecutorEngine(shardingProperties));
} catch (SQLException ex) {
throw new ShardingJdbcException(ex);
}
}
private String getDatabaseProductName(final ShardingRule shardingRule) throws SQLException {
String result = null;
Collection<Connection> connections = new ArrayList<>(shardingRule.getDataSourceRule().getDataSources().size());
for (DataSource each : shardingRule.getDataSourceRule().getDataSources()) {
Connection connection = each.getConnection();
connections.add(connection);
String databaseProductName = connection.getMetaData().getDatabaseProductName();
Preconditions.checkState(null == result || result.equals(databaseProductName), String.format("Database type inconsistent with '%s' and '%s'", result, databaseProductName));
result = databaseProductName;
}
for (Connection each : connections) {
each.close();
}
shardingContext = new ShardingContext(shardingRule, new SQLRouteEngine(shardingRule, type), new ExecutorEngine(shardingProperties));
return result;
}
@Override
......
......@@ -17,30 +17,24 @@
package com.dangdang.ddframe.rdb.sharding.jdbc;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import com.codahale.metrics.Timer.Context;
import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule;
import com.dangdang.ddframe.rdb.sharding.exception.ShardingJdbcException;
import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractConnectionAdapter;
import com.dangdang.ddframe.rdb.sharding.metrics.MetricsContext;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* 支持分片的数据库连接.
*
......@@ -77,61 +71,10 @@ public final class ShardingConnection extends AbstractConnectionAdapter {
public DatabaseMetaData getMetaData() throws SQLException {
if (connectionMap.isEmpty()) {
DataSourceRule dataSourceRule = shardingContext.getShardingRule().getDataSourceRule();
String dsName = dataSourceRule.getDataSourceNames().iterator().next();
connectionMap.put(dsName, dataSourceRule.getDataSource(dsName).getConnection());
}
return getDatabaseMetaDataFromConnection(connectionMap.values().iterator().next());
}
public static DatabaseMetaData getDatabaseMetaDataFromDataSource(final Collection<DataSource> dataSources) {
Collection<Connection> connections = null;
try {
connections = Collections2.transform(dataSources, new Function<DataSource, Connection>() {
@Override
public Connection apply(final DataSource input) {
try {
return input.getConnection();
} catch (final SQLException ex) {
throw new ShardingJdbcException(ex);
}
}
});
return getDatabaseMetaDataFromConnection(connections);
} finally {
if (null != connections) {
for (Connection each : connections) {
try {
each.close();
} catch (final SQLException ignored) {
}
}
}
}
}
private static DatabaseMetaData getDatabaseMetaDataFromConnection(final Connection connection) {
return getDatabaseMetaDataFromConnection(Lists.newArrayList(connection));
}
private static DatabaseMetaData getDatabaseMetaDataFromConnection(final Collection<Connection> connections) {
String databaseProductName = null;
DatabaseMetaData result = null;
for (Connection each : connections) {
String databaseProductNameInEach;
DatabaseMetaData metaDataInEach;
try {
metaDataInEach = each.getMetaData();
databaseProductNameInEach = metaDataInEach.getDatabaseProductName();
} catch (final SQLException ex) {
throw new ShardingJdbcException("Can not get data source DatabaseProductName", ex);
}
Preconditions.checkState(null == databaseProductName || databaseProductName.equals(databaseProductNameInEach),
String.format("Database type inconsistent with '%s' and '%s'", databaseProductName, databaseProductNameInEach));
databaseProductName = databaseProductNameInEach;
result = metaDataInEach;
String dataSourceName = dataSourceRule.getDataSourceNames().iterator().next();
connectionMap.put(dataSourceName, dataSourceRule.getDataSource(dataSourceName).getConnection());
}
return result;
return connectionMap.values().iterator().next().getMetaData();
}
@Override
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册