这个项目是来试多数据源切换的。 中台是管理库,租户库是要切换的数据源。
gate的数据库中配置了一张表记录了所有租户的地址,用户密码等,项目启动初始化
所有的租户数据源targetDataSources.put(app.getAppToken(), da);
// 将主数据源添加到更多数据源中
targetDataSources.put("dataSource", defaultDataSource);
访问时
1、DynamicDataSource extends AbstractRoutingDataSource 入口在这,返回选择的数据库的名字。(定义了一个动态数据源);
registry.registerBeanDefinition("dataSource", beanDefinition); 覆盖默认的datasource 这段代码要在系统启动运行,所以在boot启动类import了这个类
2、request请求过来时,拦截器拿到 先校验,再选择当前线程的数据源 DynamicDataSourceContextHolder.setDataSource(token);
3、对于访问管理库的请求放过去(路径以"_gate"开头的),就用默认的数据源。
(为何对于拦截器中抛出异常的请求会进入拦截器两次? 抛出后又进来一次)
源码:
https://github.com/LetsGoStan/gate.git
另一种多数据源的配置,dao层不同包下用不一样的数据源,适用于每个数据源做不同的业务(操作代码不同)。
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value=com.*.*.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>