聊聊ShardingSphere的两个Statement
聊聊ShardingSphere的两个Statement
本篇文章源码基于4.0.1版本
前几篇文章我们讲了ShardingSphere的路由、重写等操作,这篇文章我们讲一下它在SQL处理后的执行的时候可能用到了两个重要的类,ShardingStatement和ShardingPreparedStatement
ShardingStatement
从 ShardingStatement的 executeQuery()方法的可以看出进行查询的具体流程:
- 先清除先前的语句执行器
- 进行分片
- 初始化语句执行器
- 利用合并引擎工厂类创建合并引擎对象
- 获取结果集
在创建合并引擎对象的时候,需要用到执行器的执行查询的结果,我们看一下执行查询的流程
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);
}
- 创建SQLExecuteCallback对象,创建的时候会调用getQueryResult()方法获取查询结果,会根据连接模式选择不同的执行方式
- 执行回调方法,这个方法中调用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差不多,可以比较着学习。
- 点赞
- 收藏
- 关注作者
评论(0)