亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sharding-jdbc中RootInvokeHook的用法

發布時間:2021-07-09 17:15:14 來源:億速云 閱讀:179 作者:chen 欄目:大數據

本篇內容介紹了“sharding-jdbc中RootInvokeHook的用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

RootInvokeHook

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/hook/RootInvokeHook.java

public interface RootInvokeHook {
    
    /**
     * Handle when root invoke started.
     */
    void start();
    
    /**
     * Handle when root invoke finished.
     * 
     * @param connectionCount connection count
     */
    void finish(int connectionCount);
}
  • RootInvokeHook定義了start、finish接口

SPIRootInvokeHook

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/hook/SPIRootInvokeHook.java

public final class SPIRootInvokeHook implements RootInvokeHook {
    
    private final Collection<RootInvokeHook> rootInvokeHooks = NewInstanceServiceLoader.newServiceInstances(RootInvokeHook.class);
    
    static {
        NewInstanceServiceLoader.register(RootInvokeHook.class);
    }
    
    @Override
    public void start() {
        for (RootInvokeHook each : rootInvokeHooks) {
            each.start();
        }
    }
    
    @Override
    public void finish(final int connectionCount) {
        for (RootInvokeHook each : rootInvokeHooks) {
            each.finish(connectionCount);
        }
    }
}
  • SPIRootInvokeHook實現了RootInvokeHook接口,它使用NewInstanceServiceLoader注冊了RootInvokeHook;rootInvokeHooks集合由NewInstanceServiceLoader.newServiceInstances創建;start方法遍歷rootInvokeHooks,執行其start方法;finish方法則遍歷rootInvokeHooks,執行器finish方法

NewInstanceServiceLoader

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-common/src/main/java/org/apache/shardingsphere/core/spi/NewInstanceServiceLoader.java

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class NewInstanceServiceLoader {
    
    private static final Map<Class, Collection<Class<?>>> SERVICE_MAP = new HashMap<>();
    
    /**
     * Register SPI service into map for new instance.
     *
     * @param service service type
     * @param <T> type of service
     */
    public static <T> void register(final Class<T> service) {
        for (T each : ServiceLoader.load(service)) {
            registerServiceClass(service, each);
        }
    }
    
    @SuppressWarnings("unchecked")
    private static <T> void registerServiceClass(final Class<T> service, final T instance) {
        Collection<Class<?>> serviceClasses = SERVICE_MAP.get(service);
        if (null == serviceClasses) {
            serviceClasses = new LinkedHashSet<>();
        }
        serviceClasses.add(instance.getClass());
        SERVICE_MAP.put(service, serviceClasses);
    }
    
    /**
     * New service instances.
     *
     * @param service service class
     * @param <T> type of service
     * @return service instances
     */
    @SneakyThrows
    @SuppressWarnings("unchecked")
    public static <T> Collection<T> newServiceInstances(final Class<T> service) {
        Collection<T> result = new LinkedList<>();
        if (null == SERVICE_MAP.get(service)) {
            return result;
        }
        for (Class<?> each : SERVICE_MAP.get(service)) {
            result.add((T) each.newInstance());
        }
        return result;
    }
}
  • NewInstanceServiceLoader的register方法會使用ServiceLoader.load加載指定service的實現類,然后調用registerServiceClass注冊到SERVICE_MAP;newServiceInstances則找到指定service的實現類,然后挨個創建實例

OpenTracingRootInvokeHook

incubator-shardingsphere-4.0.0-RC1/sharding-opentracing/src/main/java/org/apache/shardingsphere/opentracing/hook/OpenTracingRootInvokeHook.java

public final class OpenTracingRootInvokeHook implements RootInvokeHook {
    
    public static final String ACTIVE_SPAN_CONTINUATION = "ACTIVE_SPAN_CONTINUATION";
    
    private static final String OPERATION_NAME = "/" + ShardingTags.COMPONENT_NAME + "/rootInvoke/";
    
    private ActiveSpan activeSpan;
    
    @Override
    public void start() {
        activeSpan = ShardingTracer.get().buildSpan(OPERATION_NAME).withTag(Tags.COMPONENT.getKey(), ShardingTags.COMPONENT_NAME).startActive();
        ShardingExecuteDataMap.getDataMap().put(ACTIVE_SPAN_CONTINUATION, activeSpan.capture());
    }
    
    @Override
    public void finish(final int connectionCount) {
        activeSpan.setTag(ShardingTags.CONNECTION_COUNT.getKey(), connectionCount).deactivate();
    }
}
  • OpenTracingRootInvokeHook實現了RootInvokeHook接口,其start方法創建并啟動activeSpan;finish方法則設置CONNECTION_COUNT,然后標記activeSpan為deactivate

AbstractConnectionAdapter

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

@Getter
public abstract class AbstractConnectionAdapter extends AbstractUnsupportedOperationConnection {
    
    private final Multimap<String, Connection> cachedConnections = LinkedHashMultimap.create();
    
    private boolean autoCommit = true;
    
    private boolean readOnly = true;
    
    private volatile boolean closed;
    
    private int transactionIsolation = TRANSACTION_READ_UNCOMMITTED;
    
    private final ForceExecuteTemplate<Connection> forceExecuteTemplate = new ForceExecuteTemplate<>();
    
    private final ForceExecuteTemplate<Entry<String, Connection>> forceExecuteTemplateForClose = new ForceExecuteTemplate<>();
    
    private final RootInvokeHook rootInvokeHook = new SPIRootInvokeHook();
    
    private final ShardingTransactionManager shardingTransactionManager;
    
    private ShardingTransactionManagerEngine shardingTransactionManagerEngine;
    
    private TransactionType transactionType;
    
    protected AbstractConnectionAdapter(final ShardingTransactionManagerEngine shardingTransactionManagerEngine, final TransactionType transactionType) {
        rootInvokeHook.start();
        this.transactionType = transactionType;
        this.shardingTransactionManagerEngine = shardingTransactionManagerEngine;
        shardingTransactionManager = shardingTransactionManagerEngine.getTransactionManager(transactionType);
    }

    //......

    public final void close() throws SQLException {
        closed = true;
        MasterVisitedManager.clear();
        TransactionTypeHolder.clear();
        int connectionSize = cachedConnections.size();
        try {
            forceExecuteTemplateForClose.execute(cachedConnections.entries(), new ForceExecuteCallback<Entry<String, Connection>>() {
        
                @Override
                public void execute(final Entry<String, Connection> cachedConnections) throws SQLException {
                    cachedConnections.getValue().close();
                }
            });
        } finally {
            cachedConnections.clear();
            rootInvokeHook.finish(connectionSize);
        }
    }

    //......

}
  • AbstractConnectionAdapter的構造器會執行rootInvokeHook.start();其close方法會執行rootInvokeHook.finish(connectionSize)

小結

RootInvokeHook定義了start、finish接口;SPIRootInvokeHook實現了RootInvokeHook接口,它使用NewInstanceServiceLoader注冊了RootInvokeHook;rootInvokeHooks集合由NewInstanceServiceLoader.newServiceInstances創建;start方法遍歷rootInvokeHooks,執行其start方法;finish方法則遍歷rootInvokeHooks,執行器finish方法

“sharding-jdbc中RootInvokeHook的用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

揭阳市| 普格县| 漳平市| 天峻县| 高密市| 湘潭县| 涞源县| 乐亭县| 舟曲县| 罗源县| 永靖县| 内丘县| 建宁县| 水城县| 彰化市| 漳平市| 成武县| 八宿县| 中超| 手机| 承德市| 固安县| 伽师县| 忻州市| 成安县| 广南县| 淮阳县| 太湖县| 开原市| 威宁| 陆河县| 仙居县| 禹城市| 土默特左旗| 鱼台县| 铁岭市| 岗巴县| 房山区| 陆丰市| 桐梓县| 容城县|