- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要创建一个可以管理多个数据源的服务。
当应用程序第一次运行应用程序时,这些数据源不一定存在,实际上一个端点会创建新的数据库,我希望能够切换到它们并创建数据。
例如,假设我有 3 个数据库,A、B 和 C,然后我启动应用程序,我使用创建 D 的端点,然后我想使用 D。
那可能吗?
我知道如何切换到其他数据源(如果存在),但我现在看不到任何可以使我的请求成为可能的解决方案。
你有什么想法吗?
谢谢
最佳答案
要使用 Spring Boot 实现 Multi-Tenancy ,我们可以使用 AbstractRoutingDataSource作为基础 数据源 所有“租户数据库”的类。
它有一个抽象方法determineCurrentLookupKey我们必须覆盖。它告诉 AbstractRoutingDataSource
它目前必须提供哪个租户数据源才能使用。因为它工作在多线程环境中,所以所选租户的信息应该存储在ThreadLocal
中。多变的。AbstractRoutingDataSource
将租户数据源的信息存储在其私有(private) Map<Object, Object> targetDataSources
中.这张 map 的关键是租户标识符 (例如 String 类型)和值 - 租户数据源 .要将我们的租户数据源放入此 map ,我们必须使用其 setter setTargetDataSources
.AbstractRoutingDataSource
如果没有我们必须使用方法 setDefaultTargetDataSource(Object defaultTargetDataSource)
设置的“默认”数据源,它将无法工作.
在我们设置租户数据源和默认数据源后,我们必须调用方法 afterPropertiesSet()
告诉AbstractRoutingDataSource
更新其状态。
所以我们的“MultiTenantManager”类可以是这样的:
@Configuration
public class MultiTenantManager {
private final ThreadLocal<String> currentTenant = new ThreadLocal<>();
private final Map<Object, Object> tenantDataSources = new ConcurrentHashMap<>();
private final DataSourceProperties properties;
private AbstractRoutingDataSource multiTenantDataSource;
public MultiTenantManager(DataSourceProperties properties) {
this.properties = properties;
}
@Bean
public DataSource dataSource() {
multiTenantDataSource = new AbstractRoutingDataSource() {
@Override
protected Object determineCurrentLookupKey() {
return currentTenant.get();
}
};
multiTenantDataSource.setTargetDataSources(tenantDataSources);
multiTenantDataSource.setDefaultTargetDataSource(defaultDataSource());
multiTenantDataSource.afterPropertiesSet();
return multiTenantDataSource;
}
public void addTenant(String tenantId, String url, String username, String password) throws SQLException {
DataSource dataSource = DataSourceBuilder.create()
.driverClassName(properties.getDriverClassName())
.url(url)
.username(username)
.password(password)
.build();
// Check that new connection is 'live'. If not - throw exception
try(Connection c = dataSource.getConnection()) {
tenantDataSources.put(tenantId, dataSource);
multiTenantDataSource.afterPropertiesSet();
}
}
public void setCurrentTenant(String tenantId) {
currentTenant.set(tenantId);
}
private DriverManagerDataSource defaultDataSource() {
DriverManagerDataSource defaultDataSource = new DriverManagerDataSource();
defaultDataSource.setDriverClassName("org.h2.Driver");
defaultDataSource.setUrl("jdbc:h2:mem:default");
defaultDataSource.setUsername("default");
defaultDataSource.setPassword("default");
return defaultDataSource;
}
}
tenantDataSources
这是我们放入 setTargetDataSources
的本地租户数据源存储。二传手; DataSourceProperties properties
用于从 spring.datasource.driverClassName
获取租户数据库的数据库驱动程序类名称'application.properties'(例如,org.postgresql.Driver
); addTenant
用于将新租户及其数据源添加到我们的本地租户数据源存储中。 我们可以即时执行此操作 - 感谢方法afterPropertiesSet()
; setCurrentTenant(String tenantId)
用于“切换”到给定租户的数据源。我们可以使用这种方法,例如,在 REST Controller 中处理使用数据库的请求时。请求应包含“tenantId”,例如在 X-TenantId
中 header ,我们可以检索并放入此方法; defaultDataSource()
使用内存 H2 数据库构建,以避免在工作 SQL 服务器上使用默认数据库。 spring.jpa.hibernate.ddl-auto
none
的参数禁用 Hibernate 在数据库模式中进行更改。您必须事先创建租户数据库的架构。
关于spring-boot - Multi-Tenancy : Managing multiple datasources with Spring Data JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49759672/
更新:将代码更改为立即调用并分配 dataSource ,但我仍然遇到相同的结果,但 sourceData.paginator 正在运行。 sourceData.filter 和 sourceData
我想以编程方式设置我的数据源的模型。像这样的东西: var ds = new kendo.data.DataSource({ //... }); var mod = kendo.data.Model.
我有一个多模块 maven 项目,我想将它与 一起使用tomcat7 maven插件并开始: mvn tomcat7:run 但我不知道如何配置 jndi 数据源。 我试图放入我的 pom.xml:
任何人都可以提供有关如何执行此操作的说明吗?我设置了几个不同的 JDBC 数据源,并希望能够配置用户使用不同的数据源运行相同的报告。例如。当用户A登录并运行报表A时,使用数据源1;当用户 B 登录并运
过去几周我从这个网站收集了许多有用的答案。我加入是为了对一些我认为最有帮助的答案+1,但目前还无法做到这一点。不过谢谢! 我的问题是 JBoss 7 AS 部署错误,我似乎无法追踪任何相关信息。它开始
我们遇到了一个 problem哪里 我们在一个 MDI 工作区中有两个相同窗口的实例,它们绑定(bind)到两个单独的对象模型。 对象模型覆盖了它们的 .Equals 和 .GetHashCode 方
当我运行我的独立 Web 应用程序时,spring 无法实例化数据源 bean。请注意,我不想在此项目中使用 JPA 或休眠。在这一点上我不知道为什么。我最好的猜测是依赖项或语法问题,但我无法找到解决
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我的项目使用springBoot2,并且不需要连接数据库,但是springboot自动配置数据源并在启动项目时抛出异常。我已经添加了执行,但它不起作用 @SpringBootApplication(e
我指的是下面的链接来设置环回框架并创建简单的 API https://docs.strongloop.com/display/public/LB/Getting+started+with+LoopBa
我在 SPringBoot 中的数据源有问题。我想使用 JDBC 并从数据源获取数据,但出现错误:说明: com.example.My.MyApplication 中的字段 dataSource 需要
这是在我的 spring-servlet.xml 文件中定义的具有此 id 的 bean 这是完整的堆栈跟踪 SEVERE: Exception sending context initialize
我正在尝试使用 Spring、Maven 和 Hibernate 创建一个访问 sql server 数据库的应用程序。当我尝试运行应用程序时出现以下错误: Exception in thread "
当我运行我的网络应用程序时抛出以下错误。 Exception encountered during context initialization - cancelling refresh attemp
我正在研究 Spring Boot JDBC MYSQL 示例。在这个例子中,我使用了 1.3.1.RELEASE spring boot starter 版本,当时我使用了以下 2 spring.d
Feb 20, 2012 6:30:45 AM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring ro
我引用了网址:https://o7planning.org/en/11727/understanding-spring-cloud-config-client-with-example没有任何自定义,
spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:mysql://localhost:3306/study?serverT
我有一个多线程作业(同时运行 6 个作业),这些作业使用 3 个数据源(第一个数据源上有 2 个,第二个数据源上有另外 2 个,第三个数据源上有最后 2 个)。 /* *************
我正在尝试实现从CurrencyExchange模块到CurrencyConvert的开放字段调用,但我被这个错误卡住了。有谁能帮帮我吗?我已经检查了其他答案,并试图添加#spring.datasou
我是一名优秀的程序员,十分优秀!