您好,登錄后才能下訂單哦!
本篇內容主要講解“sharding-jdbc中SQLExecutionHook的用法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“sharding-jdbc中SQLExecutionHook的用法”吧!
本文主要研究一下sharding-jdbc的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<String, Object> 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方法
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<SQLExecutionHook> 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<String, Object> 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方法
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<String, Object> 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<Object> 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信息
incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/SQLExecuteCallback.java
@RequiredArgsConstructor public abstract class SQLExecuteCallback<T> implements ShardingGroupExecuteCallback<StatementExecuteUnit, T> { private final DatabaseType databaseType; private final boolean isExceptionThrown; @Override public final Collection<T> execute(final Collection<StatementExecuteUnit> statementExecuteUnits, final boolean isTrunkThread, final Map<String, Object> shardingExecuteDataMap) throws SQLException { Collection<T> 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<String, Object> 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的用法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。