ShardingSphere JDBC 语句执行初探

SpringBoot整合ShardingSphere-JDBC 5.3.2 实现读写分离、分库分表。 SpringBoot 整合 shardingSphere-Jdbc 5.3.2 实现分库分表,读写分离 。 讲述了 分库分表、读写分离的 实现原理以及运用场景。 阅读详情

简介

在前几篇文中,我们基于源码就ShardingSphere的核心功能给运行了一遍,本篇文章开始,我们开始探索源码,看看ShardingSphere是如何进行工作的

概览

开始之前,我们先思考这次探索的疑点:

  • 1.ShardingSphere是如何加载我们配置的多个数据库源的?
  • 2.ShardingSphere是如何将语句写到不同的数据源的?

带着问题去探索,虽然可能得不到答案,但起码有个方向

基于我们JDBC探索的文章,打上相关的断点,开始我们的探索之旅

源码探索

1.寻找ShardingSphere JDBC 的入口

在下面代码中的init和process打上断点,看看能不能通过程序调用栈找到蛛丝马迹

public final class ExampleExecuteTemplate {
    
    public static void run(final ExampleService exampleService) throws SQLException {
        try {
            exampleService.initEnvironment();
            exampleService.processSuccess();
        } finally {
            exampleService.cleanEnvironment();
        }
    }
}

exampleService.initEnvironment() 进来以后,调用栈空空如也,啥也没有,看来我们第一个探索如果加载多个配置的数据源的目的告吹了

但还是继续Debug下去,竟然全是Ibatis相关的东西,没有Debug到ShardingSphere相关的代码,安慰自己,正常现象

继续探索:exampleService.processSuccess(),来到下面的相关语句的插入、查询等相关的操作,在insertData()打上断点

public class OrderServiceImpl implements ExampleService {
    @Override
    @Transactional
    public void processSuccess() throws SQLException {
        System.out.println("-------------- Process Success Begin ---------------");
        List<Long> orderIds = insertData();
        printData();
        deleteData(orderIds);
        printData();
        System.out.println("-------------- Process Success Finish --------------");
    }
}

基于之前尝试没有收获,这次不得不小心翼翼,跟着函数调用不断的深入下去

MapperProxy.class,执行下面的方法,进行跟下去:

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            if (Object.class.equals(method.getDeclaringClass())) {
                return method.invoke(this, args);
            }

            if (this.isDefaultMethod(method)) {
                return this.invokeDefaultMethod(proxy, method, args);
            }
        } catch (Throwable var5) {
            throw ExceptionUtil.unwrapThrowable(var5);
        }

        MapperMethod mapperMethod = this.cachedMapperMethod(method);
	// 从这里进入
        return mapperMethod.execute(this.sqlSession, args);
    }

来到下面的函数

    public Object execute(SqlSession sqlSession, Object[] args) {
        Object result;
        Object param;
        switch(this.command.getType()) {
        case INSERT:
            param = this.method.convertArgsToSqlCommandParam(args);
	    // 从这里进入,跟踪insert方法
            result = this.rowCountResult(sqlSession.insert(this.command.getName(), param));
            break;
        case UPDATE:
	......
    }

其中我们看到了熟悉的数据库相关的参数:SqlSession sqlSession,我们调用堆栈,查看其内容,如下图:

image.png

数据库名称竟然是 logic_db,想到秦老师讲课时说ShardingSphere UI中也能用JDBC,只是它的名称是 logic_db

此时有了一些猜测,但得继续跟踪下去,证实下

来到了:SqlSessionTemplate.class,其中重新获取了一次 sqlSession,但其实还是logic_db,继续跟

private class SqlSessionInterceptor implements InvocationHandler {
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            SqlSession sqlSession = SqlSessionUtils.getSqlSession(SqlSessionTemplate.this.sqlSessionFactory, SqlSessionTemplate.this.executorType, SqlSessionTemplate.this.exceptionTranslator);

            Object unwrapped;
            try {
		// 这里继续跟下去
                Object result = method.invoke(sqlSession, args);
                if (!SqlSessionUtils.isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) {
                    sqlSession.commit(true);
                }

                unwrapped = result;
            } catch (Throwable var11) {
               ......
            } finally {
               ......
            }
            return unwrapped;
        }
    }

一路上遇到很多的 update 操作,我们进入跟下去即可,最后我们来到:PreparedStatementHandler.class

public class PreparedStatementHandler extends BaseStatementHandler {
    public int update(Statement statement) throws SQLException {
        PreparedStatement ps = (PreparedStatement)statement;
	// 执行这里很关键了
        ps.execute();
        int rows = ps.getUpdateCount();
        Object parameterObject = this.boundSql.getParameterObject();
        KeyGenerator keyGenerator = this.mappedStatement.getKeyGenerator();
        keyGenerator.processAfter(this.executor, this.mappedStatement, ps, parameterObject);
        return rows;
    }
}

在上面的:ps.execute(),我们跟下去的时候,惊喜就来了,砰的一下,就来到了ShardingSphere自己写的类中:ShardingSpherePreparedStatement.java

到这里,对于ShardingSphere JDBC有了一些想法:

ShardingSphere JDBC 感觉其实本质上还有一个中间件,内嵌式的,同样是介于程序与数据库之间,在本地探索中,它就以一个 logic_db ,最为 Mybatis的下游,将所有的数据库进行获取截断处理

初步有这么个体会,后面随着研究的深入可能会有更多的发现,到这我们就找到了ShardingSphere的入口了

2.初步探索ShardingSphere JDBC 处理路径

在上面我们来到了这次找到的入口:ShardingSpherePreparedStatement.java

    @Override
    public boolean execute() throws SQLException {
        try {
            clearPrevious();
	    // 这里有了真实的数据库源和语句
            executionContext = createExecutionContext();
            if (metaDataContexts.getMetaData(connection.getSchemaName()).getRuleMetaData().getRules().stream().anyMatch(each -> each instanceof RawExecutionRule)) {
                // TODO process getStatement
                Collection<ExecuteResult> executeResults = rawExecutor.execute(createRawExecutionGroupContext(), executionContext.getLogicSQL(), new RawSQLExecutorCallback());
                return executeResults.iterator().next() instanceof QueryResult;
            }
            if (executionContext.getRouteContext().isFederated()) {
                List<QueryResult> queryResults = executeFederatedQuery();
                return !queryResults.isEmpty();
            }
	    // 继续跟踪
            ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext();
            cacheStatements(executionGroupContext.getInputGroups());
            return driverJDBCExecutor.execute(executionGroupContext,
                    executionContext.getLogicSQL(), executionContext.getRouteContext().getRouteUnits(), createExecuteCallback());
        } finally {
            clearBatch();
        }
    }

executionContext = createExecutionContext() 有原始的语句,还是我们定时真实的数据源和SQL语句,如下图,我们继续跟下去:

image.png

来到:AbstractExecutionPrepareEngine.java,前面其实已经能得到展示的执行语句,目前还不太清楚这步的目的是啥

    public final ExecutionGroupContext<T> prepare(final RouteContext routeContext, final Collection<ExecutionUnit> executionUnits) throws SQLException {
        Collection<ExecutionGroup<T>> result = new LinkedList<>();
        for (Entry<String, List<SQLUnit>> entry : aggregateSQLUnitGroups(executionUnits).entrySet()) {
            String dataSourceName = entry.getKey();
            List<SQLUnit> sqlUnits = entry.getValue();
            List<List<SQLUnit>> sqlUnitGroups = group(sqlUnits);
            ConnectionMode connectionMode = maxConnectionsSizePerQuery < sqlUnits.size() ? ConnectionMode.CONNECTION_STRICTLY : ConnectionMode.MEMORY_STRICTLY;
            result.addAll(group(dataSourceName, sqlUnitGroups, connectionMode));
        }
        return decorate(routeContext, result);
    }

回到 ShardingSpherePreparedStatement.java,跟踪 driverJDBCExecutor.execute,来到:DriverJDBCExecutor.java

   public boolean execute(final ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext, final LogicSQL logicSQL,
                           final Collection<RouteUnit> routeUnits, final JDBCExecutorCallback<Boolean> callback) throws SQLException {
        try {
            ExecuteProcessEngine.initialize(logicSQL, executionGroupContext, metaDataContexts.getProps());
            List<Boolean> results = jdbcLockEngine.execute(executionGroupContext, logicSQL.getSqlStatementContext(), routeUnits, callback);
            boolean result = null != results && !results.isEmpty() && null != results.get(0) && results.get(0);
            ExecuteProcessEngine.finish(executionGroupContext.getExecutionID());
            return result;
        } finally {
            ExecuteProcessEngine.clean();
        }
    }

有趣的是 jdbcLockEngine 还是 logic_db,继续跟踪execute函数,一路跟下去来到: ExecutorEngine.java

    public <I, O> List<O> execute(final ExecutionGroupContext<I> executionGroupContext,
                                  final ExecutorCallback<I, O> firstCallback, final ExecutorCallback<I, O> callback, final boolean serial) throws SQLException {
        if (executionGroupContext.getInputGroups().isEmpty()) {
            return Collections.emptyList();
        }
        return serial ? serialExecute(executionGroupContext.getInputGroups().iterator(), firstCallback, callback)
                : parallelExecute(executionGroupContext.getInputGroups().iterator(), firstCallback, callback);
    }

    private <I, O> List<O> serialExecute(final Iterator<ExecutionGroup<I>> executionGroups, final ExecutorCallback<I, O> firstCallback, final ExecutorCallback<I, O> callback) throws SQLException {
        ExecutionGroup<I> firstInputs = executionGroups.next();
        List<O> result = new LinkedList<>(syncExecute(firstInputs, null == firstCallback ? callback : firstCallback));
        while (executionGroups.hasNext()) {
	    // 继续跟踪
            result.addAll(syncExecute(executionGroups.next(), callback));
        }
        return result;
    }

一路跟踪下去,来到: JDBCExecutorCallback.java

    public final Collection<T> execute(final Collection<JDBCExecutionUnit> executionUnits, final boolean isTrunkThread, final Map<String, Object> dataMap) throws SQLException {
        // TODO It is better to judge whether need sane result before execute, can avoid exception thrown
        Collection<T> result = new LinkedList<>();
        for (JDBCExecutionUnit each : executionUnits) {
            T executeResult = execute(each, isTrunkThread, dataMap);
            if (null != executeResult) {
                result.add(executeResult);
            }
        }
        return result;
    }

    private T execute(final JDBCExecutionUnit jdbcExecutionUnit, final boolean isTrunkThread, final Map<String, Object> dataMap) throws SQLException {
        SQLExecutorExceptionHandler.setExceptionThrown(isExceptionThrown);
	// 在这里得到了我们真实的数据库源
        DataSourceMetaData dataSourceMetaData = getDataSourceMetaData(jdbcExecutionUnit.getStorageResource().getConnection().getMetaData());
        SQLExecutionHook sqlExecutionHook = new SPISQLExecutionHook();
        try {
            SQLUnit sqlUnit = jdbcExecutionUnit.getExecutionUnit().getSqlUnit();
            sqlExecutionHook.start(jdbcExecutionUnit.getExecutionUnit().getDataSourceName(), sqlUnit.getSql(), sqlUnit.getParameters(), dataSourceMetaData, isTrunkThread, dataMap);
	    // 继续跟踪执行语句
            T result = executeSQL(sqlUnit.getSql(), jdbcExecutionUnit.getStorageResource(), jdbcExecutionUnit.getConnectionMode());
            sqlExecutionHook.finishSuccess();
            finishReport(dataMap, jdbcExecutionUnit);
            return result;
        } catch (final SQLException ex) {
	    ......
        }
    }

在上面的代码中,找到直接获取真实数据库源相关的代码

image.png

我们继续跟踪执行的相关代码: ShardingSpherePreparedStatement.java , 来到

   private JDBCExecutorCallback<Boolean> createExecuteCallback() {
        boolean isExceptionThrown = SQLExecutorExceptionHandler.isExceptionThrown();
        return new JDBCExecutorCallback<Boolean>(metaDataContexts.getMetaData(connection.getSchemaName()).getResource().getDatabaseType(), sqlStatement, isExceptionThrown) {
            
            @Override
            protected Boolean executeSQL(final String sql, final Statement statement, final ConnectionMode connectionMode) throws SQLException {
                return ((PreparedStatement) statement).execute();
            }
            
            @Override
            protected Optional<Boolean> getSaneResult(final SQLStatement sqlStatement) {
                return Optional.empty();
            }
        };
    }

其中的: Statement statement ,如果用原生的 JDBC 自己写过操作数据库,那应该比较数据,那语句执行到这里就基本告一个段落了

总结

这次感觉收获还是挺大,虽然相关的数据库源的解析和语句如何打到对应的数据库的部分没有探索,但我们已经定位到了其大致的位置,可以后面继续研究

ShardingSphere JDBC 在本次探索中,感觉就是一个内嵌的 Proxy ,其数据库库名固定为 logic_db,截断了 Mybatis与真实数据库的链接,当前了中间商,大致如下图:

ShardingSphereJDBC语句执行初探.png

【ShardingSphere专题】SpringBoot整合ShardingSphere(一、数据分片入门及实验) 最近线上的项目部分数据表增量速度比较快,可以预见的是,个把月后数据量会急剧增长至千万级,所以只是简单的使用索引等已经无法满足业务需求了,分库分表势在必行!于是着手研究如何整合ShardingSphere到现有项目中,顺带记录一下实验过程吧。特别声明:这边是实验配置阶段,还没有完成整合到项目、以及测试联调阶段,所以不敢保证实验过程是否正确。而且,在我的业务中,还涉及到【普通单表】与【分片表】之间的联表查询,所以需要后期比较严谨的测试才能知道最终效果。不过我自己对比了站内其他大佬的教程,大体是没问题的。 阅读详情

相关推荐

Apache ShardingSphere-JDBC

本文摘要: 文章首先介绍了互联网时代下高性能数据库架构的两种主要模式:读写分离和数据库分片。读写分离通过将写操作路由到主库、读操作分散到从库来提升性能,可采用一主多从或多主多从配置。数据库分片则分为垂直分片(按业务拆分)和水平分片(按数据规则分布),以解决海量数据存储问题。 其次,阐述了CAP理论在分布式系统中的核心原则,分析了CP与AP两种实现方式的特点,并指出实践中只能达到最终一致性。

小钟不想敲代码 1283

ShardingSphere应用专题–4.1.1版本–Sharding-Proxy的使用(十六)

先占个位置

qq_31457665的博客 9974

ShardingSphere-JDBC-若依框架集成(SpringBoot)

ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中 使用的是若依框架前后端版本、动态数据源,可自行切换,默认数据源为达梦8代理端,

编程小菜鸟的笔记 8168

ShardingSphere代码阅读(二)

ShardingSphere源码阅读(二) 文章目录ShardingSphere源码阅读(二)前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步

Encin_Li的博客 848

Java微服务系列之 ShardingSphere - ShardingSphere-JDBC

Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。Apache ShardingSphere 设计哲学为 Database Plus,旨在构建异构数据库上层的标准和生态。它关注如何充分合理地利用数据库的计算和存储能力,而并非实现一个全新的数据库。它站在数据库的上层视角,关注它们之间的协作多于数据库自身。@Data/*** 主键*//*** 账号*//*** 用户名。

Java 技术专栏,从入门到精通,熟悉企业级开发 7375

夜间灯光遥感数据介绍及下载汇总

夜间灯光遥感数据介绍及下载汇总

qq_43874102的博客 1万+

Logical DB

逻辑数据库

Jason Cheung's Notes 899

华为ENSP完整安装教程

华为ENSP完整安装教程

Hnm456756的博客 7324

mysql分库分表概念及原理、ShardingSphere实现mysql集群分库分表&读写分离

mysql分库分表概念及原理、ShardingSphere实现mysql集群分库分表&读写分离

suiyishiguang的博客 1065

揭秘个人开发者接支付宝的‘野路子’:不用企业资质,用Python模拟扫码转账与回调监听

本文探讨了个人开发者如何通过Python模拟支付宝扫码转账与回调监听的技术实现,解析了支付宝URL协议格式,并设计了本地化的支付状态监听方案。文章强调该方法仅用于技术研究,实际应用需遵守支付宝官方接口和金融合规要求。

weixin_30736301的博客 407

从KVM虚拟化到Openstack云化架构综述

目录 摘要 OpenStack的虚拟化技术 OpenStack架构介绍 Nova Swift KeyStone Neutron Glance Cinder Ceilometer Heat 摘要 这两年的工作中,接触到公有云和私有云的项目还不少。起初对于Openstack的了解,仅停留在其几大组件的交互上,如Nova、Neutron、Glance等,以及对各大云厂商功能点上...

liyunpeng229的博客 2051

【源码】Sharding-JDBC源码分析之ContextManager创建中ShardingSphereDatabase的创建原理

本篇从源码的角度,分析了ShardingSphereDatabase的创建过程。重点分析了MetaDataContextsFactory、ShardingSphereDatabasesFactory、ShardingSphereDatabase的源码实现。

JingAi_jia917的博客 2381

innovus实战攻略 | 用setUsefulSkewMode解锁时序优化的“隐藏技能”!

就像时序优化的“瑞士军刀”,参数虽多,但掌握了分类逻辑后,用起来其实很简单!如果你有更绝的用法,欢迎在评论区分享,大家一起卷起来!简单来说,它就是时序优化的“乾坤大挪移”。通过调整触发器的时钟到达时间,把关键路径的建立时间“借”给非关键路径,从而实现全局时序收敛。别急,这个命令就是你的“时序救星”!(工具最多只能借1.2ns的裕量,防止“借过头”导致新问题!这个参数能帮你兜底!(对关键路径“下死手”,确保优化到位!(设置上限,给工具套上“紧箍咒”!(直接跳过边界,避免优化反噬!(全局管理,防止“借过头”!

weixin_50820814的博客 1354

ShardingSphere-JDBC初探

接下来本篇文章的学习重点就是ShardingSphere,早期的时候是叫ShardingJdbc,实际上ShardingJdbc是ShardingSphere内部提供的一个服务,ShardingSphere的目标是要做一个生态,而不是一个简单的JDBC分库分表工具,从官网文档可以看出,ShardingSphere是想把一些周边的组件(MySQL、zk、Oracle等)作为其生态的一个支撑(目标很宏大),具体的看官网详细介绍。分析:当前有两个库,每个库有两个分片,也就是一共4个分片。所以取模4均分数据;

weixin_58482311的博客 1148

一文吃透 ABAP RESTful Application Programming Model(RAP):从数据建模与行为,到业务服务暴露,再到服务消费

本文介绍了SAP ABAP统一编程模型RAP的核心架构与实践方法,通过构建完整的ZTRAVEL和ZBOOKING业务对象,演示了从数据建模、行为定义到服务暴露的全流程。文章详细说明了RAP三层架构(数据与行为层、服务提供层、服务消费层)的实现方式,包括CDS视图实体定义、行为定义(BDEF)中的事务能力声明、投影与服务绑定等关键步骤。特别强调了ABAP Cloud环境下的开发限制和最佳实践,如使用GUID和late numbering机制,以及如何通过EML语言操作业务对象。最后提供了完整的代码示例,展示了

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 521

Robot Framework 7.0 报告解析

本文深入解析 Robot Framework 7.0 新增的 JSON 报告功能,手把手教你如何从 output.xml 转换为结构清晰的 output.json,并通过 Python 脚本提取关键测试指标。文章附完整示例、命令、解析脚本,支持导出为 CSV 和 Markdown,方便接入可视化看板、群通知和 CI 流程。适用于测试自动化、质量平台建设和回归趋势分析场景。

点点寒彬的博客 264

ShardingSphere-JDBC执行原理

一、ShardingSphere-JDBC是什么 Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立却又能够混合部署配合使用的产品组成。 定位为轻量级 Java 框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。 适用于任何基于JDBC的ORM框架,如:JPA,

zuoshengdong的博客 2749

樽海鞘优化算法详解:原理、实现与应用

本文详细介绍了樽海鞘优化算法(SSA)的原理、实现与应用。该算法模拟樽海鞘链式群体行为,将优化问题解空间映射为群体移动空间,通过领导者引导和追随者跟随的协作机制寻找最优解。文章从生物特性、数学模型到Python代码实现进行了系统阐述,包括种群初始化、位置更新公式和收敛因子等核心要素,并展示了算法在函数优化等领域的应用潜力。该算法具有结构简单、参数少、实现容易等特点,在多种优化问题上表现良好。

qq_42212808的博客 644

ShardingSphere-JDBC 详解

Apache ShardingSphere-JDBC 是轻量级 Java 框架,提供分库分表、读写分离、数据加密等分布式数据库增强功能。核心能力包括:灵活的分片算法(支持标准、范围及复合分片)、读写分离负载均衡、多种分布式事务方案(XA/SeAT/Saga)、透明化数据加密和影子库压测支持。其工作流程涵盖SQL解析、路由优化、改写执行和结果归并。作为嵌入式JDBC扩展,它具有无中心化、低侵入等优势,适用于大数据量、高并发及快速增长的Java应用场景。相比ShardingSphere-Proxy,JDBC方案

csdn_tom_168的博客 997

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ShardingSphere-JDBC

ShardingSphere-JDBC 提供了一套完整的解决方案,用于解决传统单数据库面临的数据量大、并发高、数据安全等问题。通过灵活的配置和强大的功能,它能够、并发高、数据安全等问题。通过灵活的配置和强大的功能,它能够帮助开发者在不改变现有数据库架构的前提下,实现数据的水平分片、读写分离、数据加密以及影子库压测等高级数据库操作,从而提升应用的性能、扩展性和安全性。

JAVA_codemaster的博客 1196

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ShardingSphere-JDBC快速入门

SharingSphere-JDBC使用

qq_45003354的博客 1366

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ShardingSphere-JDBC 使用教程

ShardingSphere-JDBC 使用教程 【免费下载链接】shardingsphere 项目地址: https://gitcode.com/gh_mirrors/shard/shardingsphere ...

gitblog_00550的博客 1002

Shardingsphere-JDBC初体验

Apache ShardingSphere(Incubator) 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。...

dbqb007的专栏 7416

关于ShardingSphere-JDBC的简介及使用

现状及目标 由于旧的业务表中数据量会持续增长,且没有对数据做分表、索引,最终导致查询上亿数据时报错。因此决定使用ShardingSphere-JDBC对表数据做数据分片处理。 ShardingSphere-JDBC简介 ShardingSphere-JDBC是什么 ShardingSphere-JDBC作为Apache ShardingSphere的一个独立的产品。定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外

vampire_Violet的博客 1831

ShardingSphere-jdbc实战

ShardingSphere-JDBC 是 Apache ShardingSphere 的第一个产品,现已更名为 ShardingSphere。定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。在学习Sharding-JDBC分库分表之前,我们有必要先了解分库分表的一些知识。分库分表。

qq_38055805的博客 1437

ShardingSphere-JDBC使用

ShardingSphere-JDBC

1532
上一篇: ShardingSphere UI 初步体验
下一篇: SharingSphere 源码解析 -- 真实SQL生成探索
_萧_
博客等级 码龄10年 55粉丝 157原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值