千家信息网

sharding-jdbc中SQLExecutionHook的用法

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"sharding-jdbc中SQLExecutionHook的用法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"sharding-jdb
千家信息网最后更新 2026年11月02日sharding-jdbc中SQLExecutionHook的用法

本篇内容主要讲解"sharding-jdbc中SQLExecutionHook的用法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"sharding-jdbc中SQLExecutionHook的用法"吧!

序

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

SQLExecutionHook

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

public interface SQLExecutionHook {        /**     * Handle when SQL execution started.     *      * @param routeUnit route unit to be executed     * @param dataSourceMetaData data source meta data     * @param isTrunkThread is execution in trunk thread     * @param shardingExecuteDataMap sharding execute data map     */    void start(RouteUnit routeUnit, DataSourceMetaData dataSourceMetaData, boolean isTrunkThread, Map shardingExecuteDataMap);        /**     * Handle when SQL execution finished success.     */    void finishSuccess();        /**     * Handle when SQL execution finished failure.     *     * @param cause failure cause     */    void finishFailure(Exception cause);}
  • SQLExecutionHook接口定义了start、finishSuccess、finishFailure方法

SPISQLExecutionHook

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

public final class SPISQLExecutionHook implements SQLExecutionHook {        private final Collection sqlExecutionHooks = NewInstanceServiceLoader.newServiceInstances(SQLExecutionHook.class);        static {        NewInstanceServiceLoader.register(SQLExecutionHook.class);    }        @Override    public void start(final RouteUnit routeUnit, final DataSourceMetaData dataSourceMetaData, final boolean isTrunkThread, final Map shardingExecuteDataMap) {        for (SQLExecutionHook each : sqlExecutionHooks) {            each.start(routeUnit, dataSourceMetaData, isTrunkThread, shardingExecuteDataMap);        }    }        @Override    public void finishSuccess() {        for (SQLExecutionHook each : sqlExecutionHooks) {            each.finishSuccess();        }    }        @Override    public void finishFailure(final Exception cause) {        for (SQLExecutionHook each : sqlExecutionHooks) {            each.finishFailure(cause);        }    }}
  • SPISQLExecutionHook实现了SQLExecutionHook接口;它使用NewInstanceServiceLoader注册了SQLExecutionHook;sqlExecutionHooks集合由NewInstanceServiceLoader.newServiceInstances创建;start方法遍历sqlExecutionHooks,执行其start方法;finishSuccess方法则遍历sqlExecutionHooks,执行其finishSuccess方法;finishFailure方法则遍历sqlExecutionHooks,执行其finishFailure方法

OpenTracingSQLExecutionHook

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

public final class OpenTracingSQLExecutionHook implements SQLExecutionHook {        private static final String OPERATION_NAME = "/" + ShardingTags.COMPONENT_NAME + "/executeSQL/";        private ActiveSpan activeSpan;        private Span span;        @Override    public void start(final RouteUnit routeUnit, final DataSourceMetaData dataSourceMetaData, final boolean isTrunkThread, final Map shardingExecuteDataMap) {        if (!isTrunkThread) {            activeSpan = ((ActiveSpan.Continuation) shardingExecuteDataMap.get(OpenTracingRootInvokeHook.ACTIVE_SPAN_CONTINUATION)).activate();        }        span = ShardingTracer.get().buildSpan(OPERATION_NAME)                .withTag(Tags.COMPONENT.getKey(), ShardingTags.COMPONENT_NAME)                .withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)                .withTag(Tags.PEER_HOSTNAME.getKey(), dataSourceMetaData.getHostName())                .withTag(Tags.PEER_PORT.getKey(), dataSourceMetaData.getPort())                .withTag(Tags.DB_TYPE.getKey(), "sql")                .withTag(Tags.DB_INSTANCE.getKey(), routeUnit.getDataSourceName())                .withTag(Tags.DB_STATEMENT.getKey(), routeUnit.getSqlUnit().getSql())                .withTag(ShardingTags.DB_BIND_VARIABLES.getKey(), toString(routeUnit.getSqlUnit().getParameters())).startManual();            }        private String toString(final List parameterSets) {        return parameterSets.isEmpty() ? "" : String.format("[%s]", Joiner.on(", ").join(parameterSets));    }        @Override    public void finishSuccess() {        span.finish();        if (null != activeSpan) {            activeSpan.deactivate();        }    }        @Override    public void finishFailure(final Exception cause) {        ShardingErrorSpan.setError(span, cause);        span.finish();        if (null != activeSpan) {            activeSpan.deactivate();        }    }}
  • OpenTracingSQLExecutionHook实现了SQLExecutionHook接口,其start方法创建并启动span、activeSpan;finishSuccess及finishFailure方法都会执行span.finish()及activeSpan.deactivate(),只是finishFailure则会标记span的exception信息

SQLExecuteCallback

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/SQLExecuteCallback.java

@RequiredArgsConstructorpublic abstract class SQLExecuteCallback implements ShardingGroupExecuteCallback {        private final DatabaseType databaseType;        private final boolean isExceptionThrown;        @Override    public final Collection execute(final Collection statementExecuteUnits, final boolean isTrunkThread,                                       final Map shardingExecuteDataMap) throws SQLException {        Collection result = new LinkedList<>();        for (StatementExecuteUnit each : statementExecuteUnits) {            result.add(execute0(each, isTrunkThread, shardingExecuteDataMap));        }        return result;    }        private T execute0(final StatementExecuteUnit statementExecuteUnit, final boolean isTrunkThread, final Map shardingExecuteDataMap) throws SQLException {        ExecutorExceptionHandler.setExceptionThrown(isExceptionThrown);        DataSourceMetaData dataSourceMetaData = DataSourceMetaDataFactory.newInstance(databaseType, statementExecuteUnit.getStatement().getConnection().getMetaData().getURL());        SQLExecutionHook sqlExecutionHook = new SPISQLExecutionHook();        try {            sqlExecutionHook.start(statementExecuteUnit.getRouteUnit(), dataSourceMetaData, isTrunkThread, shardingExecuteDataMap);            T result = executeSQL(statementExecuteUnit.getRouteUnit(), statementExecuteUnit.getStatement(), statementExecuteUnit.getConnectionMode());            sqlExecutionHook.finishSuccess();            return result;        } catch (final SQLException ex) {            sqlExecutionHook.finishFailure(ex);            ExecutorExceptionHandler.handleException(ex);            return null;        }    }        protected abstract T executeSQL(RouteUnit routeUnit, Statement statement, ConnectionMode connectionMode) throws SQLException;}
  • SQLExecuteCallback的execute0方法在执行前创建SPISQLExecutionHook,然后调用sqlExecutionHook.start方法,执行成功之后执行sqlExecutionHook.finishSuccess方法,捕获到SQLException则执行sqlExecutionHook.finishFailure方法

小结

SQLExecutionHook接口定义了start、finishSuccess、finishFailure方法;SPISQLExecutionHook实现了SQLExecutionHook接口;它使用NewInstanceServiceLoader注册了SQLExecutionHook;sqlExecutionHooks集合由NewInstanceServiceLoader.newServiceInstances创建;start方法遍历sqlExecutionHooks,执行其start方法;finishSuccess方法则遍历sqlExecutionHooks,执行其finishSuccess方法;finishFailure方法则遍历sqlExecutionHooks,执行其finishFailure方法

到此,相信大家对"sharding-jdbc中SQLExecutionHook的用法"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

方法 接口 内容 学习 实用 更深 成功 会标 信息 兴趣 只是 实用性 实际 小结 操作简单 更多 朋友 网站 频道 查询 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技服务与互联网 深圳齐家互联网科技 互联网科技论坛 互联网科技公司做什么 江苏南京365互联网科技 以后互联网后是啥科技 中化能源互联网科技招聘 厦门比较好的科技互联网公司 河南猎农互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 明优互联网科技有限公司 合肥互联网科技公司公章图片 每天都有哪些好的互联网科技 广东工业互联网大赛深圳学泰科技 互联网科技资金流入 风投北京互联网科技 互联网风格科技公司名称 济南小医互联网科技有限公司招聘 东风日产互联网科技公司叫什么 现代科技的标志之一的互联网 互联网科技公司经营范围 为想互联网科技怎么样 互联网 科技创新 互联网科技小贷 百单互联网科技有限公司 国外互联网科技网站 人人互联网科技是培训 东营紫格互联网科技 西安有哪些互联网高科技企业 互联网科技自媒体灵感
0