Skip to content

Commit 9e6e701

Browse files
author
lanyuanxiaoyao
committed
修改文件: _posts/2017-07-14-muti-tenant.md
1 parent 9199f83 commit 9e6e701

File tree

1 file changed

+86
-4
lines changed

1 file changed

+86
-4
lines changed

_posts/2017-07-14-muti-tenant.md

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,17 +134,99 @@ spring.jpa.properties.hibernate.multi_tenant_connection_provider=cloud.tenant.Mu
134134
```
135135
这就是所需要的所有相关配置(如果你有别的配置就另外加上就是了),其中Database配置一定要有,就是一定要有一个默认的配置才能启动Spring boot,这个不能省……这是一个坑。
136136
- 关于Hibernate的几个配置项的说明
137-
- show-sql
137+
- **show-sql**
138138
这个也无关多租户的设置,只是在控制台显示Hibernate执行的sql语句,方便调试
139-
- hibernate.multiTenancy
139+
- **hibernate.multiTenancy**
140140
选择多租户的模式,有四个参数:`NONE``DATABASE``SCHEMA``DISCRIMINATOR`,其中`NONE`就是默认没有模式,`DISCRIMINATOR`会在Hibernate5支持,所以我们根据模式选择是独立数据库还是不独立数据库就可以了,我这里选择SCHEMA,因为只有一台物理机器
141-
- hibernate.tenant_identifier_resolver
141+
- **hibernate.tenant_identifier_resolver**
142142
租户ID解析器,简单来说就是这个设置指定的类负责每次执行sql语句的时候获取租户ID
143-
- hibernate.multi_tenant_connection_provider
143+
- **hibernate.multi_tenant_connection_provider**
144144
这个设置指定的类负责按照租户ID来提供相应的数据源
145145

146146
**配置后三个设置项的时候会没有自动提示,直接复制就行了,只要名字没错就ok,因为没有自动提示搞到我以为设置在这里是不行的**
147147

148+
### tenant包
149+
这里的三个类是全部和多租户相关的类,这里我连同导包的信息也一并贴上了,希望大家不要导错包,同名的包有不少
150+
#### TenantDataSourceProvider
151+
```java
152+
import cloud.entity.TenantInfo;
153+
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
154+
155+
import javax.sql.DataSource;
156+
import java.util.HashMap;
157+
import java.util.Map;
158+
159+
/**
160+
* @author lanyuanxiaoyao
161+
*/
162+
public class TenantDataSourceProvider {
163+
164+
// 使用一个map来存储我们租户和对应的数据源,租户和数据源的信息就是从我们的tenant_info表中读出来
165+
private static Map<String, DataSource> dataSourceMap = new HashMap<>();
166+
167+
/**
168+
* 静态建立一个数据源,也就是我们的默认数据源,假如我们的访问信息里面没有指定tenantId,就使用默认数据源。
169+
* 在我这里默认数据源是cloud_config,实际上你可以指向你们的公共信息的库,或者拦截这个操作返回错误。
170+
*/
171+
static {
172+
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
173+
dataSourceBuilder.url("jdbc:postgresql://localhost:5432/cloud_config");
174+
dataSourceBuilder.username("lanyuanxiaoyao");
175+
dataSourceBuilder.password("");
176+
dataSourceBuilder.driverClassName("org.postgresql.Driver");
177+
dataSourceMap.put("Default", dataSourceBuilder.build());
178+
}
179+
180+
// 根据传进来的tenantId决定返回的数据源
181+
public static DataSource getTenantDataSource(String tenantId) {
182+
if (dataSourceMap.containsKey(tenantId)) {
183+
System.out.println("GetDataSource:" + tenantId);
184+
return dataSourceMap.get(tenantId);
185+
} else {
186+
System.out.println("GetDataSource:" + "Default");
187+
return dataSourceMap.get("Default");
188+
}
189+
}
190+
191+
// 初始化的时候用于添加数据源的方法
192+
public static void addDataSource(TenantInfo tenantInfo) {
193+
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
194+
dataSourceBuilder.url(tenantInfo.getUrl());
195+
dataSourceBuilder.username(tenantInfo.getUsername());
196+
dataSourceBuilder.password(tenantInfo.getPassword());
197+
dataSourceBuilder.driverClassName("org.postgresql.Driver");
198+
dataSourceMap.put(tenantInfo.getTenantId(), dataSourceBuilder.build());
199+
}
200+
201+
}
202+
```
203+
#### MultiTenantConnectionProviderImpl
204+
```java
205+
import org.hibernate.engine.jdbc.connections.spi.AbstractDataSourceBasedMultiTenantConnectionProviderImpl;
206+
import javax.sql.DataSource;
207+
208+
/**
209+
* 这个类是Hibernate框架拦截sql语句并在执行sql语句之前更换数据源提供的类
210+
* @author lanyuanxiaoyao
211+
* @version 1.0
212+
*/
213+
public class MultiTenantConnectionProviderImpl extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl {
214+
215+
// 在没有提供tenantId的情况下返回默认数据源
216+
@Override
217+
protected DataSource selectAnyDataSource() {
218+
return TenantDataSourceProvider.getTenantDataSource("Default");
219+
}
220+
221+
// 提供了tenantId的话就根据ID来返回数据源
222+
@Override
223+
protected DataSource selectDataSource(String tenantIdentifier) {
224+
System.out.println("selectDataSource:" + tenantIdentifier);
225+
return TenantDataSourceProvider.getTenantDataSource(tenantIdentifier);
226+
}
227+
}
228+
```
229+
148230
[1]: https://www.github.com/lanyuanxiaoyao/GitGallery/raw/master/2017/7/14/Spring%20Boot%EF%BC%88%E4%B8%89%EF%BC%89%20Spring%20boot%20+%20Hibernate%20%E5%A4%9A%E7%A7%9F%E6%88%B7%E7%9A%84%E4%BD%BF%E7%94%A8/Ashampoo_Snap_2017%E5%B9%B47%E6%9C%8814%E6%97%A5_12h27m50s_001_.png "目录结构"
149231
[2]: https://www.github.com/lanyuanxiaoyao/GitGallery/raw/master/2017/7/14/Spring%20Boot%EF%BC%88%E4%B8%89%EF%BC%89%20Spring%20boot%20+%20Hibernate%20%E5%A4%9A%E7%A7%9F%E6%88%B7%E7%9A%84%E4%BD%BF%E7%94%A8/Ashampoo_Snap_2017%E5%B9%B47%E6%9C%8814%E6%97%A5_13h40m46s_002_.png "数据库结构"
150232
[3]: https://www.github.com/lanyuanxiaoyao/GitGallery/raw/master/2017/7/14/Spring%20Boot%EF%BC%88%E4%B8%89%EF%BC%89%20Spring%20boot%20+%20Hibernate%20%E5%A4%9A%E7%A7%9F%E6%88%B7%E7%9A%84%E4%BD%BF%E7%94%A8/Ashampoo_Snap_2017%E5%B9%B47%E6%9C%8814%E6%97%A5_13h41m52s_005_.png "cloud_config"

0 commit comments

Comments
 (0)