聊聊ShardingSphere的两个Statement

举报
周杰伦本人 发表于 2022/11/29 17:21:03 2022/11/29
【摘要】 聊聊ShardingSphere的两个Statement本篇文章源码基于4.0.1版本前几篇文章我们讲了ShardingSphere的路由、重写等操作,这篇文章我们讲一下它在SQL处理后的执行的时候可能用到了两个重要的类,ShardingStatement和ShardingPreparedStatement ShardingStatement从 ShardingStatement的 exe...

聊聊ShardingSphere的两个Statement

本篇文章源码基于4.0.1版本

前几篇文章我们讲了ShardingSphere的路由、重写等操作,这篇文章我们讲一下它在SQL处理后的执行的时候可能用到了两个重要的类,ShardingStatement和ShardingPreparedStatement

ShardingStatement

从 ShardingStatement的 executeQuery()方法的可以看出进行查询的具体流程:

  1. 先清除先前的语句执行器
  2. 进行分片
  3. 初始化语句执行器
  4. 利用合并引擎工厂类创建合并引擎对象
  5. 获取结果集

在创建合并引擎对象的时候,需要用到执行器的执行查询的结果,我们看一下执行查询的流程

public List<QueryResult> executeQuery() throws SQLException {
        final boolean isExceptionThrown = ExecutorExceptionHandler.isExceptionThrown();
        SQLExecuteCallback<QueryResult> executeCallback = new SQLExecuteCallback<QueryResult>(getDatabaseType(), isExceptionThrown) {
            
            @Override
            protected QueryResult executeSQL(final String sql, final Statement statement, final ConnectionMode connectionMode) throws SQLException {
                return getQueryResult(sql, statement, connectionMode);
            }
        };
        return executeCallback(executeCallback);
    }
  1. 创建SQLExecuteCallback对象,创建的时候会调用getQueryResult()方法获取查询结果,会根据连接模式选择不同的执行方式
  2. 执行回调方法,这个方法中调用SQL执行模板类SQLExecuteTemplate的executeGroup()方法,SQLExecuteTemplate可以和JdbcTemplate对比着学习,这个方法中又直接调用了ShardingExecuteEngine的groupExecute()方法,分为串行执行serialExecute()方法和并行执行parallelExecute()方法,无论串行还是并行,都会使用当前线程来执行一次模式,然后再进行串行或并行处理

内存限制模式

对数据库的连接数量不做限制,创建多个连接,并行执行,对应创建MemoryQueryResult对象,构造方法中调用了getRows()方法获取全部数据行后放入内存中

连接限制模式

只会创建一个连接,串行执行查询,对应创建StreamQueryResult流加载查询结果对象,

ShardingPreparedStatement

ShardingPreparedStatement的 executeQuery()方法和ShardingStatement的方法基本一致,他们两个关系和PreparedStatement 与Statement的关系差不多,前者可以进行参数的设置,后者不支持

总结

这篇文章我们说了一下ShardingSphere的ShardingStatement和ShardingPreparedStatement,ShardingPreparedStatement的功能包含了ShardingSphere,它还可以设置参数,和我们使用JDBC操作数据库的时候PreparedStatement 与Statement差不多,可以比较着学习。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。