sharding-jdbc梳理(三)

一般来说shardingjdbc虽然用配置文件比较清晰明了,但是实际应用中使用java config更加的灵活,今天抽空看了下之前同事封装的shardingjdbc-starter。原理跟配置文件肯定是没什么区别,但是具体实现上可以更加灵活的自定义处理分库分表:自定义分库分表算法、自定义管理分库分表的信息,直接从数据库加载等。
总结一下大概实现思路:
1、首先要明白怎样通过java config 实现分库分表?
配置文件中我们直接配置一下就可以使用druiddatasource来接管datasource,所以在java程序中我们也要实现这个datasource的实例化接管功能。通过程序接管我们要先知道ioc容器初始化实例bean的一些步骤,ioc容器初始化bean之前是先去加载所有bean的定义信息,然后创建实例的时候通过这些bean的定义信息去实例化。我们自己接管这个datasource的实例就是要自己实现它的实例化,修改它的bean的定义信息。首先来了解下:BeanFactoryPostProcessor,BeanFactoryPostProcessor和BeanPostProcessor这两个接口都是初始化bean时对外暴露的入口之一,和Aware类似,说通俗一些就是可以管理我们的bean工厂内所有的beandefinition(未实例化)数据,可以随心所欲的修改属性。所以我们可以定义一个类来实现此接口,在实现类里面重写postProcessBeanFactory方法,在这个方法里面我们重新按照druiddatasource的实现来重新定义我们的datasource的bean。我们创建datasource的实例是通过ShardingDataSourceFactory.createDataSource(dataMap,shardJdbcConfig,new Properties());说下这三个参数分别是什么,第一个参数是一个Map<String,Datasource>,每一个元素对应一个数据库的真实数据节点的数据源配置对象,用来指定需要分库分表的数据源。第二个参数就是我们分库分表的路由配置信息的对象。在这个对象里面我们通过shardJdbcConfig.getTableRuleConfigs().add(getShardTableRule());绑定getShardTableRule()这个方法里面我们配置了表的分库分表策略、表映射库跟表的对应关系。shardJdbcConfig里面还可以配置广播表、绑定表配置默认分库分表规则、配置默认基础库一般是指向公共基础库,配置读写分离等。然后就是第三个参数Properties的实例对象,在这个里面我们可以配置是否打印sql解析和改写日志、用于sql执行的工作线程数量等。如果不配置就像我们上面那样直接new Proerties()也可以。
2、再说下分库分表的算法:无论是分库还是分表的算法可以根据一共四种算法,自己根据需求实现,我们是都实现了PreciseShardingAlgorithm<Integer>接口,里面实现doSharding(Collection<String> listName, PreciseShardingValue<Integer> shardingValue)方法即可,这个Ingeter是根据自己分库分表时拼接后缀定义。// ListName就是所谓的实际数据库表节点,而shardingValue其实就是分片项,也就是比如user_id,developer_id等字段值对应的分库分表算法对应的最后返回的就是我们实际的数据库或者表的名字的字符串。
3、再说下同事的实现是用数据库维护了mysql信息,这样的好处是不用自己在java程序中一个个去定义真实的数据源节点对象信息,而是通过mysql拉取自动生成那个Map<String,Datasource>。因此也就是需要先创建数据库表以及填写相关信息然后引入starter启动的时候就可以自动加载了。这里重点说下这个加载的时机,我们要控制在加载完bean定义并且是我们修改bean定义之前。BeanDefinitionRegistryPostProcessor。这个接口了解下BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor。其接口方法postProcessBeanDefinitionRegistry();     在所有bean定义信息将要被加载,bean实例还未创建的时候加载,优先于BeanFactoryPostProcessor执行;  利用BeanDefinitionRegistryPostProcessor给容器中再额外添加一些组件;因此我们可以在postProcessBeanDefinitionRegistry();    方法中调用数据库初始化的方法,直接去mysql中拉去数据库实际数据节点的数据库真实配置信息。具体拉取就不再说了可以直接写个java原生jdbc连接数据库。
基本到此为止,已经是构建了一个sharding的基础组件,但是并不能做成starter,因为starter本身的机制是读取配置文件映射到实例bean中然后再基于这个做后面的操作,但是上面的操作实际上都在实例化bean之前。但是有一点我们可以继续改进,将拉取数据源配置信息的url、username、password、分库分表的tablename等信息配置到配置文件中,通过Binder从environment中拉取配置信息。

参考文档:
ShardingJDBC的基本配置和使用 - 会炼钢的小白龙 - 博客园  shardjdbc采用java程序基础配置实现
Spring后置处理器之-BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor_林海静的博客-CSDN博客   BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor 
【SpringBoot】基于BeanDefinitionRegistryPostProcessor实现配置文件读取动态注入多个Bean_弱水提沧的博客-CSDN博客  获取Environment来读取环境基础属性信息
【SpringBoot】配置文件的加载与属性值的绑定_石臻臻的杂货铺-CSDN博客    Binder从environment中读取配置到自定义实例对象中

实战:
SpringBoot+Sharding-JDBC操作分库分表(超超超详细)_1-只小猴子的博客-CSDN博客_shardingjdbc分库分表
数据库分库分表_u013739073的专栏-CSDN博客

ShardingJDBC的基本配置和使用 - 会炼钢的小白龙 - 博客园
SpringBoot使用Sharding-JDBC分库分表 - dalaoyang - 博客园

Sharding-jdbc设置defaultDatasource无效问题解决和源码分析解决记录 - 不晓得侬 - 博客园

配置文件方式指定分库分表算法
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值