千家信息网

sharding-jdbc中AbstractDataSourceAdapter的用法

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇文章主要介绍"sharding-jdbc中AbstractDataSourceAdapter的用法",在日常操作中,相信很多人在sharding-jdbc中AbstractDataSourceAd
千家信息网最后更新 2025年01月24日sharding-jdbc中AbstractDataSourceAdapter的用法

这篇文章主要介绍"sharding-jdbc中AbstractDataSourceAdapter的用法",在日常操作中,相信很多人在sharding-jdbc中AbstractDataSourceAdapter的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"sharding-jdbc中AbstractDataSourceAdapter的用法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

本文主要研究一下sharding-jdbc的AbstractDataSourceAdapter

AbstractUnsupportedOperationDataSource

incubator-shardingsphere-4.0.0-RC1/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/unsupported/AbstractUnsupportedOperationDataSource.java

public abstract class AbstractUnsupportedOperationDataSource extends WrapperAdapter implements DataSource {        @Override    public final int getLoginTimeout() throws SQLException {        throw new SQLFeatureNotSupportedException("unsupported getLoginTimeout()");    }        @Override    public final void setLoginTimeout(final int seconds) throws SQLException {        throw new SQLFeatureNotSupportedException("unsupported setLoginTimeout(int seconds)");    }}
  • AbstractUnsupportedOperationDataSource继承了WrapperAdapter,声明实现javax.sql.DataSource接口,其覆盖了getLoginTimeout、setLoginTimeout方法,抛出SQLFeatureNotSupportedException异常

AbstractDataSourceAdapter

incubator-shardingsphere-4.0.0-RC1/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/adapter/AbstractDataSourceAdapter.java

@Getter@Setterpublic abstract class AbstractDataSourceAdapter extends AbstractUnsupportedOperationDataSource implements AutoCloseable {        private final DatabaseType databaseType;        private final Map dataSourceMap;        private ShardingTransactionManagerEngine shardingTransactionManagerEngine = new ShardingTransactionManagerEngine();        private PrintWriter logWriter = new PrintWriter(System.out);        public AbstractDataSourceAdapter(final Map dataSourceMap) throws SQLException {        databaseType = getDatabaseType(dataSourceMap.values());        shardingTransactionManagerEngine.init(databaseType, dataSourceMap);        this.dataSourceMap = dataSourceMap;    }        protected final DatabaseType getDatabaseType(final Collection dataSources) throws SQLException {        DatabaseType result = null;        for (DataSource each : dataSources) {            DatabaseType databaseType = getDatabaseType(each);            Preconditions.checkState(null == result || result.equals(databaseType), String.format("Database type inconsistent with '%s' and '%s'", result, databaseType));            result = databaseType;        }        return result;    }        private DatabaseType getDatabaseType(final DataSource dataSource) throws SQLException {        if (dataSource instanceof AbstractDataSourceAdapter) {            return ((AbstractDataSourceAdapter) dataSource).databaseType;        }        try (Connection connection = dataSource.getConnection()) {            return DatabaseType.valueFrom(connection.getMetaData().getDatabaseProductName());        }    }        @Override    public final Logger getParentLogger() {        return Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);    }        @Override    public final Connection getConnection(final String username, final String password) throws SQLException {        return getConnection();    }        @Override    public void close() throws Exception {        for (DataSource each : dataSourceMap.values()) {            try {                Method method = each.getClass().getDeclaredMethod("close");                method.setAccessible(true);                method.invoke(each);            } catch (final ReflectiveOperationException ignored) {            }        }        shardingTransactionManagerEngine.close();    }}
  • AbstractDataSourceAdapter继承了AbstractUnsupportedOperationDataSource,实现了AutoCloseable接口;它的构造器接收一个DataSource的map,并执行shardingTransactionManagerEngine.init;close方法会遍历dataSourceMap,挨个反射调用执行close方法

ShardingTransactionManagerEngine

incubator-shardingsphere-4.0.0-RC1/sharding-transaction/sharding-transaction-core/src/main/java/org/apache/shardingsphere/transaction/ShardingTransactionManagerEngine.java

@Slf4jpublic final class ShardingTransactionManagerEngine {        private final Map transactionManagerMap = new HashMap<>();        public ShardingTransactionManagerEngine() {        loadShardingTransactionManager();    }        private void loadShardingTransactionManager() {        for (ShardingTransactionManager each : ServiceLoader.load(ShardingTransactionManager.class)) {            if (transactionManagerMap.containsKey(each.getTransactionType())) {                log.warn("Find more than one {} transaction manager implementation class, use `{}` now",                    each.getTransactionType(), transactionManagerMap.get(each.getTransactionType()).getClass().getName());                continue;            }            transactionManagerMap.put(each.getTransactionType(), each);        }    }        /**     * Initialize sharding transaction managers.     *     * @param databaseType database type     * @param dataSourceMap data source map     */    public void init(final DatabaseType databaseType, final Map dataSourceMap) {        for (Entry entry : transactionManagerMap.entrySet()) {            entry.getValue().init(databaseType, getResourceDataSources(dataSourceMap));        }    }        private Collection getResourceDataSources(final Map dataSourceMap) {        List result = new LinkedList<>();        for (Map.Entry entry : dataSourceMap.entrySet()) {            result.add(new ResourceDataSource(entry.getKey(), entry.getValue()));        }        return result;    }        /**     * Get sharding transaction manager.     *     * @param transactionType transaction type     * @return sharding transaction manager     */    public ShardingTransactionManager getTransactionManager(final TransactionType transactionType) {        ShardingTransactionManager result = transactionManagerMap.get(transactionType);        if (TransactionType.LOCAL != transactionType) {            Preconditions.checkNotNull(result, "Cannot find transaction manager of [%s]", transactionType);        }        return result;    }        /**     * Close sharding transaction managers.     *      * @throws Exception exception     */    public void close() throws Exception {        for (Entry entry : transactionManagerMap.entrySet()) {            entry.getValue().close();        }    }}
  • ShardingTransactionManagerEngine维护了ShardingTransactionManager的map,其构造器执行loadShardingTransactionManager方法,它会使用ServiceLoader.load(ShardingTransactionManager.class)加载,然后放入transactionManagerMap中;init方法会遍历transactionManagerMap,然后挨个执行init方法;close方法则遍历transactionManagerMap,挨个执行close方法

小结

AbstractDataSourceAdapter继承了AbstractUnsupportedOperationDataSource,实现了AutoCloseable接口;它的构造器接收一个DataSource的map,并执行shardingTransactionManagerEngine.init;close方法会遍历dataSourceMap,挨个反射调用执行close方法

到此,关于"sharding-jdbc中AbstractDataSourceAdapter的用法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0