我现在插入一条数据,我们看看ShardingPreparedStatement的execute方法
清理缓存的数据
下一步就是sql路由了,PreparedStatementRoutingEngine要完成路由功能,包含了分库分表的策略
ParsingSQLRouter还是ShardingMasterSlaveRouter的选择
ParsingSQLRouter真正实现的类是SQLParsingEngine
我们看看SQLParsingEngine的parse方法,如果存在缓存,则直接返回,否则我们进行解析
我们找到具体的SQLParser,根据tokenType判断是AbstractInsertParser、 AbstractUpdateParser 、 AbstractDeleteParser?
根据dbType选择具体的InsertParser 例如我们是mysql,选择的是MySQLInsertParser
下一步就是ParsingSQLRouter的route方法
首先看看getGenerateKey方法,找到表策略、自增字段,生成id
我们看看返回的ShardingConditions结果
我们看看RoutingEngineFactory的newInstance方法,找到具体的StandardRoutingEngine
我们看下StandardRoutingEngine的routeDataSources方法
例如userId为2,我们可以得到ds_0和表t_order_2
我们看看SQLRewriteEngine的对于sql的生成方法
下面我们看看PreparedStatementExecutor的execute方法
实际上我们要关注的几个点
SQLParsingEngine 执行 parse 返回SQLStatement
RoutingEngine (StandardRoutingEngine)执行 route 返回RoutingResult
SQLRewriteEngine执行 rewrite 返回 SQLBuilder
ShardingExecuteEngine执行groupExecute 返回执行结果
网友评论