DataSource学习
上次被问到DataSource如何实现动态切换租户连接。被问蒙了。
这里补一下相关知识。
1、简要的流程:
Client->>Interceptor: 请求携带Token
Interceptor->>TenantContext: 解析tenantId并存储
Interceptor->>DataSourceRouter: 触发数据源路由
DataSourceRouter->>TenantContext: 获取当前tenantId
DataSourceRouter->>JPA: 返回对应数据源
JPA->>Database: 执行SQL操作
如果要细展开
首先说明一下DataSource负责连接池的管理,把请求路由到实际租户的物理DataSource,以及最终连接的提供。
那就是Spring的
AbstractRoutingDataSource的 determineTargetDataSource
这个方法实现的。
具体实现由子类实现。
开源的比如MyBatis 和 Druid都提供 DynamicDataSource类,只需要配置租户ID与数据源的映射关系就行。
或者可以自己去实现Spring的 AbstractRoutingDataSource类。建立一个map,维护好tenantId和不同租户的pool的关系。
DataSource 技术规范归属。
DataSource 是 javax.sql 的也就是JDK的。rt.jar中。属于JDBC规范接口生态。
Spring的 AbstractRouingDataSource回答了你的问题。这个类的determineTargetDataSource负责根据tenantId返回pool,进而生成connection存到上下文里。
这个步骤是访问数据库或者建立事务时触发。