千家信息网

sharding-jdbc中RootInvokeHook的用法

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"sharding-jdbc中RootInvokeHook的用法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家
千家信息网最后更新 2026年11月01日sharding-jdbc中RootInvokeHook的用法

本篇内容介绍了"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 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>> SERVICE_MAP = new HashMap<>();        /**     * Register SPI service into map for new instance.     *     * @param service service type     * @param  type of service     */    public static  void register(final Class service) {        for (T each : ServiceLoader.load(service)) {            registerServiceClass(service, each);        }    }        @SuppressWarnings("unchecked")    private static  void registerServiceClass(final Class service, final T instance) {        Collection> 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  type of service     * @return service instances     */    @SneakyThrows    @SuppressWarnings("unchecked")    public static  Collection newServiceInstances(final Class service) {        Collection 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

@Getterpublic abstract class AbstractConnectionAdapter extends AbstractUnsupportedOperationConnection {        private final Multimap cachedConnections = LinkedHashMultimap.create();        private boolean autoCommit = true;        private boolean readOnly = true;        private volatile boolean closed;        private int transactionIsolation = TRANSACTION_READ_UNCOMMITTED;        private final ForceExecuteTemplate forceExecuteTemplate = new ForceExecuteTemplate<>();        private final ForceExecuteTemplate> 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>() {                        @Override                public void execute(final Entry 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的用法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

方法 接口 内容 更多 知识 执行器 实用 学有所成 接下来 困境 实例 实际 小结 情况 文章 标记 案例 编带 网站 行业 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 耶加雪菲 深圳市人人互联网科技有限公司 广东猪兼强互联网科技有限公司 互联网是第几次科技革命的成果 西安纸贵互联网科技有限公司 互联网科技深圳 期待互联网科技 互联网科技作文 美国互联网黑科技 沃里互联网科技 科技与互联网的利与弊 互联网为啥属于高科技 湖北码尼互联网科技有限公司电话 卓翼科技产业互联网合作 无锡工业互联网科技有限公司 山东子淼互联网科技有限公司 互联网科技年终奖 南京一网一红互联网科技有限公司 宁波跨境商互联网科技有限公司 科技互联网经济论坛 广东猪兼强互联网科技有限公司 互联网金融公司科技 科技创新互联网企业 唐信互联网科技 大连 互联网金融监管科技 甘肃拓世互联网科技有限公司 农村开互联网科技讲堂 哈尔滨新华互联网科技学院 互联网科技股为什么大涨 山东蛋芒互联网科技有限公司
0