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

2022-09-03 02:56:38

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

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

User

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

现在,此DTO(实体)不仅存储在一个数据库中,同一用户的一些信息(字段)存储在一个数据库中,而另一些则存储在另一个数据库中。

MSsql

Table user
int, id
String, name
String, accountNumber


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

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

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

我们目前的建议是,如果用户想要使用街道字段应用排序,我们在进度数据库中运行查询并使用此结果集获取页面(使用分页),然后直接转到具有这些键的MSSQLServer User表,然后运行另一个查询以提取缺少的信息并将其保存到我们的DTO并将其传输到UI。with 隐含 在一个数据库中运行查询,然后根据第二个数据库中返回的键运行另一个查询。

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

从技术上讲,我们将创建一个jparepository,它充当外观,并根据字段在正确的数据库中进行过程。

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

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


答案 1

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

在Spring框架中没有对此架构的开箱即用支持,但您可以轻松地将对偶隐藏在服务层后面。您甚至可以为 ACID 操作配置 JTA 数据源DataSource


答案 2

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

所以,总结一下:

1-为两个数据库发出两个sql查询以获取用户

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

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


推荐