sharding-JDBC源码分析(一)标准JDBC接口实现

sharding-JDBC源码分析(一)标准JDBC接口实现希望读者看完Sharding-JDBC系列文章后,掌握分库分表核心知识点,了解实现原理,自行实现简单的嵌入式分库分表组件,另外也希望读者思考为什么分库分表?以及分库分表后带来的问题?以及如何处理该类问题等,这也是面试中常见知识点。 JDBC是J2EE的标准规范之一,J2EE就是…

希望读者看完Sharding-JDBC系列文章后,掌握分库分表核心知识点,了解实现原理,自行实现简单的嵌入式分库分表组件,另外也希望读者思考为什么分库分表?以及分库分表后带来的问题?以及如何处理该类问题等,这也是面试中常见知识点。

1、JDBC标准接口

JDBC是J2EE的标准规范之一,J2EE就是为了规范JAVA解决企业级应用开发制定的一系列规范,JDBC也不例外。

JDBC是用于Java编程语言和数据库之间的数据库无关连接的标准Java API。换句话说,使用JAVA语言连接数据库进行操作,就需要使用JDBC API。

统一的JDBC API接口,屏蔽了底层数据库的细节,可以使用一致性的编码(跨数据库)对数据库进行操作。通过JDBC将JAVA应用于数据库访问连接进行解耦,可以相互独立发展,又能够结合使用。

各数据库提供的驱动实现JDBC标准 API,访问数据库,应用不用为访问不同数据库而在编码层进行适配

sharding-JDBC源码分析(一)标准JDBC接口实现

Sharding-JDBC处理也不例外,原理相同。sharding-JDBC实现标准JDBC协议外外提供接口,比如ShardingConnection、ShardingStatement等供外部使用,清楚JDBC后,Sharding-JDBC就好理解了,下来分析sharding-JDBC实现JDBC四大接口,后面对sharding-JDBC简称sharding

2、JDBC四大接口实现

2.1、 Connection

sharding中shardingConnection实现了标准的JDBC Connection接口,首先看下类关系图 sharding-JDBC源码分析(一)标准JDBC接口实现

抽象类AbstractUnsupportedOperationConnection实现Connection原生接口,其中对于sharding中不支持Connection的方法在此类中抛异常

 @Override
    public final CallableStatement prepareCall(final String sql) throws SQLException {
        throw new SQLFeatureNotSupportedException("prepareCall");
    }
   ......
    
    @Override
    public final CallableStatement prepareCall(final String sql, final int resultSetType, final int resultSetConcurrency) throws SQLException {
        throw new SQLFeatureNotSupportedException("prepareCall");
    }

AbstractConnectionAdapter中实现了功能逻辑,包括创建连接,关闭连接等,该类中有三个需要掌握的地方,个人觉得不错,可以提升编码能力

  • ForceExecuteTemplate 类提供执行模板方法参数是一个collection 和callbackForceExecuteCallback 回调接口
    public void execute(final Collection<T> targets, final ForceExecuteCallback<T> callback) throws SQLException {
        Collection<SQLException> exceptions = new LinkedList<>();
        for (T each : targets) {
            try {
                callback.execute(each);
            } catch (final SQLException ex) {
                exceptions.add(ex);
            }
        }
        throwSQLExceptionIfNecessary(exceptions);
    }

自己体会这样写的好处。

  • RootInvokeHook钩子方法

通过SPI方式注册钩子方法,记录调用过程,可以有多种实现,这种扩展方式比较灵活,易于扩展,可以方便的适配不同的平台对调用链信息采集,

public interface RootInvokeHook {
    
    /** * Handle when root invoke started. */
    void start();
    
    /** * Handle when root invoke finished. * * @param connectionCount connection count */
    void finish(int connectionCount);
}

SPI实现

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);
        }
    }
}

流程开始调用

 protected AbstractConnectionAdapter() {
        rootInvokeHook.start();
    }

流程结束

 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);
        }
    }

可以利用钩子方法统计SQL执行时间等,这种扩展设计方法可以学习。

2.2、Statement

sharding中shardingStatement实现Statement接口,shardingPrepareStatement实现PreparedStatement sharding-JDBC源码分析(一)标准JDBC接口实现

抽象类作用与Connection基本相似,这里不重复介绍,主要看shardingstatement与SharingPrepareStatement

2.3、ResultSet

sharding-JDBC 中shardingResultSet实现了ResultSet接口,主要对结果集进行处理,以前在单库场景中操作的单个resultSet,现在可能返回多个,需要对结果集进行处理 sharding-JDBC源码分析(一)标准JDBC接口实现

shardingResultSet有个成员变量

private final MergedResult mergeResultSet

这是一个接口,主要对不同的结果集处理,看下实现就可以明白大概意思 sharding-JDBC源码分析(一)标准JDBC接口实现

这里细节不做分析,后边会针对结果集合并有专门章节进行分析。结果集合并在分库分表中间件的实现中算是个难点。

2.4、DataSource

ShardingDataSource实现了DataSource接口,提供获取connection方法

    @Override
    public final ShardingConnection getConnection() {
        return new ShardingConnection(getDataSourceMap(), runtimeContext, TransactionTypeHolder.get());
    }

3、结束语

主要对Sharding-JDBC实现标准的JDBC协议做了整体介绍,以及Sharding-JDBC中入口,这是实现一个ORM必不可少的知识点,比如Mybatis等,后面章节会对分库分表路由模块、SQL执行模块、结果集合并模块的源码会细致的进行分析,希望读者看完这一系列文章后,可以自己实现简化版的分库分表组件。

今天的文章sharding-JDBC源码分析(一)标准JDBC接口实现分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/17964.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注