java吧 关注:1,216,230贴子:12,665,858

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

只看楼主收藏回复

直接开干


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


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


      IP属地:湖南3楼2020-09-12 10:03
      回复


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


          IP属地:湖南5楼2020-09-12 10:07
          回复



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


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


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


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


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


                      IP属地:湖南11楼2020-09-12 10:19
                      回复




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


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


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


                              IP属地:湖南15楼2020-09-12 10:30
                              回复