java吧 关注:1,185,080贴子:12,587,170

玩个有意思的玩意,mybatis切换数据源

只看楼主收藏回复

直接开干


1楼2020-09-12 10:01回复
    网上基本案例很多,
    方式1是多少个数据源就创建多少个sqlSessionFactory,这种主要是无法很简单的实现从数据库动态读取数据源配置;
    方式2就是使用spring爸爸提供的AbstractRoutingDataSource类


    2楼2020-09-12 10:02
    回复
      对于数据源来说,获取db连接,应该算是它最重要的功能了,然后我们看看AbstractRoutingDataSource怎么动态获取连接的


      3楼2020-09-12 10:03
      回复


        4楼2020-09-12 10:04
        回复
          看继承关系,我们需要注意的是InitializingBean,
          为啥特别指出暂时先卖个关子,咱先看看比较关心的获取连接的方法


          5楼2020-09-12 10:07
          回复



            6楼2020-09-12 10:09
            回复
              简单来说 AbstractRoutingDataSource维护了一个resolvedDataSources(map),每次通过determineCurrentLookupKey获取map的key,然后根据key从resolvedDataSources获取dataSource的key,从而完成获取连接的工作


              7楼2020-09-12 10:11
              回复
                但是有点尴尬的是,resolvedDataSources并不是直接给我们开放的,我们需要注入的其实是这两个


                8楼2020-09-12 10:13
                回复
                  然后在afterPropertiesSet方法中做数据copy,这也就解释了开始为啥我们需要关心InitializingBean这个接口,不知道的童鞋,可以百度下这个接口的功能,这里不做细说


                  9楼2020-09-12 10:14
                  回复
                    动态获取connection就搞定了,前置条件已经完成,然后我们复习下事务相关的逻辑,这里可能会有点绕,从没看过源码的萌新,建议直接下滑找结论


                    10楼2020-09-12 10:18
                    回复
                      老规矩,demo是依赖于springboot,版本是2.1.16.RELEASE从注解EnableTransactionManagement开始说说


                      11楼2020-09-12 10:19
                      回复




                        12楼2020-09-12 10:22
                        回复
                          咱找到了拦截器的入口,基本东西就知道了一大半不过我们这里不会涉及到事务传播的相关知识,所以有些部分会直接跳过


                          13楼2020-09-12 10:24
                          回复
                            然后就是拦截器的代码了


                            14楼2020-09-12 10:24
                            回复
                              截图太多,我就选择性的选了几张


                              15楼2020-09-12 10:30
                              回复