真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

sharding-jdbc中AbstractDataSourceAdapter的用法

這篇文章主要介紹“sharding-jdbc中AbstractDataSourceAdapter的用法”,在日常操作中,相信很多人在sharding-jdbc中AbstractDataSourceAdapter的用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”sharding-jdbc中AbstractDataSourceAdapter的用法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、諸城ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的諸城網(wǎng)站制作公司

本文主要研究一下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,聲明實(shí)現(xiàn)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
@Setter
public 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,實(shí)現(xiàn)了AutoCloseable接口;它的構(gòu)造器接收一個(gè)DataSource的map,并執(zhí)行shardingTransactionManagerEngine.init;close方法會(huì)遍歷dataSourceMap,挨個(gè)反射調(diào)用執(zhí)行close方法

ShardingTransactionManagerEngine

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

@Slf4j
public 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維護(hù)了ShardingTransactionManager的map,其構(gòu)造器執(zhí)行l(wèi)oadShardingTransactionManager方法,它會(huì)使用ServiceLoader.load(ShardingTransactionManager.class)加載,然后放入transactionManagerMap中;init方法會(huì)遍歷transactionManagerMap,然后挨個(gè)執(zhí)行init方法;close方法則遍歷transactionManagerMap,挨個(gè)執(zhí)行close方法

小結(jié)

AbstractDataSourceAdapter繼承了AbstractUnsupportedOperationDataSource,實(shí)現(xiàn)了AutoCloseable接口;它的構(gòu)造器接收一個(gè)DataSource的map,并執(zhí)行shardingTransactionManagerEngine.init;close方法會(huì)遍歷dataSourceMap,挨個(gè)反射調(diào)用執(zhí)行close方法

到此,關(guān)于“sharding-jdbc中AbstractDataSourceAdapter的用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


當(dāng)前題目:sharding-jdbc中AbstractDataSourceAdapter的用法
網(wǎng)站地址:http://weahome.cn/article/pdgode.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部