spring 多db数据源

为啥

新年新气象

spring 数据库连接

spring 使用SqlSessionFactoryBean 管理连接

SqlSessionFactoryBean 实现了 Spring 的 FactoryBean 接口。这意味着由 Spring 最终创建的 bean 并不是 SqlSessionFactoryBean 本身,sqlSessionFactory 的初始化操作由工厂类SqlSessionFactoryBean 的buildSqlSessionFactory() 方法完成, getObject() 方法的返回结果。这种情况下,Spring 将会在应用启动时为你创建 SqlSessionFactory,并使用 sqlSessionFactory 这个名字存储起来

buildSqlSessionFactory 大致流程:读xml和配置的数据,调用ibatis 的sqlSessionFactoryBuilder.build 来继续构造连接,里面有openSession 方法,这里面newExecutor初始化了连接池,

连接池类型:都继承了BaseExecutor, 根据配置的defaultExecutorType 来使用下面不同类型的连接池,
流程BaseExecutor 有query(),update() 方法供SqlSession 调用,里面调用了,下面的连接池实例的duQuery,doUpdate 实现不同功能:BaseExecutor 执行队列使用ConcurrentLinkedQueue,本地缓存,因此mybatis 默认开通了localCache,每次查询,先根据sql和limit,offset等构建key,先找缓存数据,当然每次更新就会清一下缓存

  list = resultHandler == null ? (List)this.localCache.getObject(key) : null;
                if (list != null) {
                    this.handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
                } else {
                    list = this.queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
                }

BatchExecutor
ReuseExecutor
SimpleExecutor

参考链接:BaseExecutor: https://blog.csdn.net/qq924862077/article/details/52634178

dataSource

数据源是对数据库以及对数据库交互操作的抽象,应用程序抽象出一个数据库

AbstractRoutingDataSource

org.springframework.jdbc.datasource.lookup 下的类,在determineCurrentLookupKey 中返回dataSource的key 即可动态选择数据源
Object lookupKey = this.determineCurrentLookupKey();
DataSource dataSource = (DataSource)this.resolvedDataSources.get(lookupKey);

数据源切换

通过切面,每次指定数据源信息,将数据源的key,存放线程内部的存储类ThreadLocal中。然后每次访问数据源时AbstractRoutingDataSource会执行determineCurrentLookupKey方法(需要自定义实现)来决定使用哪个数据源。


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注