@@ -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