从两个不同的数据库中检索相同 DTO 的信息

Retrieve information for the same DTO from two different databases

我试图通过一个简短的例子使它尽可能简单。

我们有两个数据库,一个在 MSSQLServer 中,另一个在进行中。 我们有用户 DTO,如下所示,我们在 Web 应用程序中的 UI table 中显示。

User

int, id
String, name
String, accountNumber
String, street
String, city
String, country

现在这个DTO(Entity)不只存在一个数据库中,同一个用户的一些信息(字段)存在一个数据库中,一些存在另一个数据库中。

MSsql

Table user
int, id
String, name
String, accountNumber


Table userModel
int, id
String, street
String, city
String, country

如您所见,密钥是两个数据库中唯一 link 两个 table 的部分,正如我之前所说,它们不在同一个数据库中,也不使用相同的数据库供应商。

我们需要对每一列的 UI table 进行排序。显然,我们需要使用来自两个数据库的信息创建用户 dto。

我们目前的建议是,如果用户想使用街道字段应用排序,我们 运行 在 Progress 数据库中查询并使用此结果集获取页面(使用分页)并直接转到 MSSQLServer用户 table 使用这些键和 运行 另一个查询来提取丢失的信息并将其保存到我们的 DTO 并将其传输到 UI。 With 意味着 运行 在一个数据库中进行查询,然后在第二个数据库中基于返回的键进行其他查询。

数据库的顺序可能会根据用户想要应用排序的列(字段)而改变。

从技术上讲,我们将创建一个 jparepository 作为外观,并根据字段在正确的数据库中进行处理。

我的问题是: 在这个场景中有一些常用的模式,我们正在使用 spring,所以可能 spring 有一些开箱即用的功能来支持这个需求,如果可以使用,那就太好了jparepositories(我对此有几个疑问,因为我们将使用两个不同的实体管理器,每个数据库一个)。

注意:不能将数据从一个数据库移动到另一个数据库。

为此,您需要单独 DataSource/EntityManagerFactory/JpaRepository

在 Spring 框架中 没有开箱即用的 支持此架构,但您可以轻松隐藏双重 DataSource在服务层后面配对。您甚至可以配置 JTA DataSources for ACID operations.

因为您总是需要从两个数据库中获取数据,为什么不填充本地 java 用户对象然后对这些对象进行排序(使用带有您要排序的适当字段的比较器)。 在本地排序与在数据库查询中排序的优点是您不必在每次更改排序字段时都向数据库发送请求。

所以,总结一下:

1- 对两个数据库发出两个 sql 查询以获得您的用户

2- 使用检索到的值构建您的用户对象

3- 使用 Java 比较器对任何字段的用户进行排序,而无需向数据库发出新查询。

我的建议是找到一种方法将 link 2 个数据库放在一起,这样您就可以在不影响代码的情况下使用数据库驱动程序功能。

基本上,如果 Progress 数据库可以 linked 到 SQL 服务器,您将能够使用单个 SQL 查询和 id 列上的连接来查询这两个数据库,并且您将为您的应用程序显示合并、排序和分页的结果集。

我不是 Progress 数据库方面的专家,但它似乎有一个 ODBC 驱动程序,因此您可以尝试 link it to SQL Server