public final class ShardingJdbcNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("strategy", new ShardingJdbcStrategyBeanDefinitionParser());
registerBeanDefinitionParser("data-source", new ShardingJdbcDataSourceBeanDefinitionParser());
registerBeanDefinitionParser("master-slave-data-source", new MasterSlaveDataSourceBeanDefinitionParser());
}
}
sharding-jdbc 源码分析
SpringShardingDataSource
基于Spring命名空间的分片数据源。sharding-jdbc采用自定义Spring Schema的方式,提高了配置的便捷性。shards-jdbc自定义了三个Spring Schema:
SpringShardingDatdaSource
类的解析由ShardingJdbcDataSourceBeanDefinitionParser
完成,BeanDefinition的解析代码如下:随着IOC容器初始化完成,业务代码就可以引用
SpringShardingDataSource
了,这对于sharding-jdbc来说,才刚刚开始。接下来根据官网的example,来看看整个调用流程,这里从简单的jdbc入手分析。调用流程如下:
SQLRouteEngine
解析sql之后,由
SQLRouteEngine
负责路由。MasterSlaveDataSource
sharding-jdbc支持主从配置,由
MasterSlaveDataSource
完成这部分工作,该类的属性如下:标志位
DML_FLAG
是一个ThreadLocal变量,如果当前线程处理过或将要处理非查询sql,则将该标志位设为true
,并返回master数据源,否则使用从库的负载均衡策略(默认采用轮询调度算法),从slave数据源列表中选取一个数据源并返回:lombok
lombok旨在通过注解的方式减少或消除冗余的JAVA代码,需要注意的是,自动生成的代码并不会在源码中体现,lombak是通过修改字节码达到目的。 官网链接:https://projectlombok.org
Spring自定义Schema
自定义Schema包括如下几个步骤:
TODO
MoreExecutors.getExitingExecutorService