多租户情况下数据源的设置(AbstractRoutingDataSource)
来源:互联网 发布:fuse linux命令 编辑:程序博客网 时间:2024/05/17 08:54
在多租户的情况,如果将所有租户的数据保存在同一数据库同一schama内,这会给数据的管理和安全带来很大风险,虽然这样做的成本最佳。
另一种方式是将不同的租户保存在不同的schama内,这样一个租户对应一个schema,这样管理比较方便,出现问题风险也比较小点,实现这样的方式就会有多个数据源,
因为所有的租户对就的都一同一个应用实体,它们只是应用不同的数据库。所以我们就要在每个用户在操作应用系统时,为这个用户设置正确的数据源来对数据库进行操作,
spring 为我们提供了数据源路由的抽象类,AbstractRoutingDataSource。继承这个抽象类为,首先初始化所有租户的数据源,然后对过protected Object determineCurrentLookupKey() 方法返回当前租户的数据源。达到对数据库的操作。
下面简单说明下AbstractRoutingDataSource类:
首先看下AbstractRoutingDataSource类结构,继承了AbstractDataSource
- public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {
- }
既然是AbstractDataSource,当然就是javax.sql.DataSource的子类,于是我们自然地回去看它的getConnection方法:
- public Connection getConnection() throws SQLException {
- return determineTargetDataSource().getConnection();
- }
原来奥妙就在determineTargetDataSource()里:
- /**
- * Retrieve the current target DataSource. Determines the
- * {@link #determineCurrentLookupKey() current lookup key}, performs
- * a lookup in the {@link #setTargetDataSources targetDataSources} map,
- * falls back to the specified
- * {@link #setDefaultTargetDataSource default target DataSource} if necessary.
- * @see #determineCurrentLookupKey()
- */
- protected DataSource determineTargetDataSource() {
- Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
- Object lookupKey = determineCurrentLookupKey();
- DataSource dataSource = (DataSource) this.resolvedDataSources.get(lookupKey);
- if (dataSource == null) {
- dataSource = this.resolvedDefaultDataSource;
- }
- if (dataSource == null) {
- throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
- }
- return dataSource;
- }
这里用到了我们需要进行实现的抽象方法determineCurrentLookupKey(),该方法返回需要使用的DataSource的key值,然后根据这个key从resolvedDataSources这个map里取出对应的DataSource,如果找不到,则用默认的resolvedDefaultDataSource
- <bean id="onlineDynamicDataSource" class="com.xx.stat.base.dynamic.DynamicDataSource">
- <property name="targetDataSources">
- <map key-type="java.lang.String">
- <entry key="xx" value-ref="dataSourceXX"/>
- <entry key="yy" value-ref="dataSourceYY"/>
- </map>
- </property>
- <property name="defaultTargetDataSource" ref="dataSource"/>
- </bean>
观察上面的配置文件,发现我们配置的是targetDataSources和defaultTargetDataSource
- 多租户情况下数据源的设置(AbstractRoutingDataSource)
- quartz 动态JOB时参数的传递(特别是在多租户情况下很重要)
- AbstractRoutingDataSource实现数据源切换
- AbstractRoutingDataSource动态切换数据源
- Spring的AbstractRoutingDataSource 实现 数据源DB的动态切换
- spring 使用AbstractRoutingDataSource自定义动态数据源时的事务处理问题
- Oracle12.2 多租户环境下的授权管理
- SpringMVC 使用jndi 多个数据源且利用AbstractRoutingDataSource实现动态数据源切换
- 剖析Force.com的多租户架构(4)- Force.com的多租户架构(下)
- 剖析Force.com的多租户架构(4)- Force.com的多租户架构(下)
- //在绑定数据源的情况下添加一行
- Eclipselink多租户的实现
- ABP框架的多租户
- 多租户设计-数据层的多租户支持
- 利用AbstractRoutingDataSource实现动态数据源切换
- 利用AbstractRoutingDataSource实现动态数据源切换
- 利用AbstractRoutingDataSource实现动态数据源切换
- 利用AbstractRoutingDataSource实现动态数据源切换
- 转载一篇 写的很好 ,学习了 text段,data段,bss段
- c++库
- SQL怎么查询重复记录,删除重复记录
- secureCRT 串口不能输入任意键
- ASP.NET C# URL加密解密
- 多租户情况下数据源的设置(AbstractRoutingDataSource)
- poj1141
- Linux系统的休眠与唤醒简介
- Java网页已经过期解决
- 网页布局之Div vs Table (1)
- log4j使用(2)
- 标准linu休眠和唤醒机制分析(一)
- MFC输出整数值
- HGE像素碰撞,像素检测,多边形碰撞检测