【问题标题】:How to connect database with configuration stored in main database at run time in Spring Boot?如何在 Spring Boot 运行时将数据库与存储在主数据库中的配置连接起来?
【发布时间】:2020-01-24 03:00:26
【问题描述】:

我有一个要求,我有一个主数据库,其中包含不同客户端数据库连接的配置。当我使用包含 JWT 的 Rest API 发布数据时,该令牌将包含客户端名称并基于客户端名称,我必须从主数据库获取客户端数据库配置并进行数据库连接并将数据插入该数据库。

我浏览过各种关于它的帖子,但找不到任何具体的例子。

目前我在项目中使用带有 Data JPA 的 Spring Boot。如果有人对 Spring JDBC Template 有任何解决方案,我已准备好将我的应用程序移入其中。

【问题讨论】:

  • 正确的方向是使用Multi-tenant,然后创建您自己的自定义Multitenant Connection Provider,以便提供/切换选择的datasource
  • 基本上这是一种多租户架构,我们从多个源/客户端获取数据,我们必须根据租户或客户端(他们自己的模式)存储数据。您可以从数据库(主数据库)中获取信息并自行创建连接,并将其保存在连接池中,并使用地图、租户作为键。当您必须插入数据时,您可以从 Map 中获取连接并插入数据。

标签: hibernate spring-boot spring-data-jpa jdbctemplate


【解决方案1】:

正如@Jonathan Johx 提到的它是一个多租户应用程序,每个租户都有自己的架构。 为了提供一些具体的指导,您可以创建一个特殊的数据源作为真实数据源的代理,每个数据源可以负责 1 个模式连接。

Spring 已经为此目的提供了AbstractRoutingDatSource,或者您可以自己滚动。基本上你应该定义一些映射方法 (determineCurrentLookupKey) 并维护可以实时更新的实际数据源的键映射,以防需要连接新的数据源。

我发现 This SO post 更深入地解释了这种方法,因此没有理由重复这些信息。

根据您的问题需要考虑的几点:

  • 有时应该在运行时注册新的数据源
  • 如果没有人使用它,通过在某个 ttl 上关闭数据源来关闭连接并释放应用程序端和 RDBMS 端的资源可能是值得的。
  • 既然您提到了 spring boot,它可能有一个执行器健康检查来检查数据库连接,因此请确保它仍然满足要求。我之所以提到这一点,是因为如果它会以非 200 代码响应,并且您在一些进行此类健康检查的高级环境中运行(如 kubernetes、ecs 等),则微服务可能因此不被认为是健康的,所以你的开发人员可能会生气:)

【讨论】:

猜你喜欢
  • 2021-10-03
  • 2015-06-18
  • 1970-01-01
  • 2019-02-07
  • 2015-02-26
  • 2020-10-04
  • 2019-03-16
  • 2017-05-25
  • 2020-02-26
相关资源
最近更新 更多