【发布时间】:2019-12-02 07:04:15
【问题描述】:
目前我有一个旧的 JSF 项目,我的公司想要切换到更新的技术,如 Spring Boot。问题是我有 1 个主数据库,包含所有信息和每个产品 1 个数据库。当我更新主数据库时,相应的产品数据库也应该更新。所以主数据库用于分发数据。架构完全不一样!
有没有办法将 JPA 与不同的动态数据源一起使用? 例如,如果我更新客户,我会检查所有数据库是否包含此特定客户。如果它们包含它,我想打开到这个数据库的连接。数据库凭证和信息存储在主数据库中。所以这不是静态数据,用户可以创建/连接新数据库到系统。
有没有办法使用动态创建的特定数据源创建 JpaRepository?
在我们的旧项目中:
public ProductDatabaseDAO(final String ipAddress, final String databaseName, final String databaseUser, final String databasePassword) {
Map <String, String> connectionProperties = EntityManagerFactoryProduct.getStandardProperties();
connectionProperties.put("hibernate.connection.username", databaseUser);
connectionProperties.put("hibernate.connection.password", databasePassword);
connectionProperties.put("hibernate.connection.url", "jdbc:mysql://" + ipAddress + "/" + databaseName + "?useSSL=false" + "&autoconnect=true");
this.factory = EntityManagerFactoryProduct.getEntityManagerFactory(databaseName, connectionProperties);
this.databaseName = databaseName;
this.ipAddress = ipAddress;
this.databasePassword = databasePassword;
this.databaseUser = databaseUser;
}
我在 Multi-Tenancy 中尝试过,它就像一个 Charm。但是我必须管理大约 130 个数据库,并且不可能保持 130 个 Hikari 池开放。所以我必须关闭它们,但这听起来像是一个糟糕的解决方案。 我也考虑过更改 Hikari 池的 URL,但这听起来也不是正确的解决方案。
【问题讨论】:
-
也许如果你重构你的应用程序,你也可以重构你的连接过程并为多数据库使用更简单的方法:它可以是多实体管理器,也可以是多租户实体管理器。第一个似乎更适合您的情况:1.stackoverflow.com/questions/2311614/… 2.tech.asimio.net/2017/01/17/…
-
看来你需要某种multi-tenancy...
标签: java spring spring-boot spring-data-jpa spring-data