为了做隔离性比较好的multi-tenant app,决定做schema based multi-tenant,这就需要
- Runtime切换DataSource
- 为了使添加新tenant不用重启,最好还能实现Runtime添加DataSource
所以分2步实现这两个功能。
代码:https://github.com/fanjingdan012/ssm
目前有3个branch
- master是基础版Spring+Mybatis+Mariadb,能Read一个DataSource
- multi-data-source是实现Runtime切换DataSource的
- multi-tenant是实现现Runtime添加DataSource的
1.预先定义DataSource,Runtime切换
1.1.效果
- 数据库准备,这里用了mariadb,用了两个schema, test和test2,里面是同样的一张member表,插入一点不同的数据
- 用header控制Tenant-ID,从而访问不同的DataSource
1.2.代码
写一个MultitenantDataSource.java, MultitenantDataSource extends AbstractRoutingDataSource
看一下AbstractRoutingDataSource
的源代码
protected DataSource determineTargetDataSource() {
Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
Object lookupKey = determineCurrentLookupKey();
DataSource dataSource = this.resolvedDataSources.get(lookupKey);
if (dataSource == null && (this.lenientFallback || lookupKey == null)) {
dataSource = this.resolvedDefaultDataSource;
}
if (dataSource == null) {
throw new IllegalSt