繁体   English   中英

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

[英]Retrieve information for the same DTO from two different databases

我试着通过一个简短的例子尽可能地简化这个。

我们有两个数据库,一个在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。

我们此时的建议是,如果用户想要使用街道字段应用排序,我们在Progress数据库中运行查询并使用此结果集获取页面(使用分页)并直接转到带有这些键的MSSQLServer User表并运行另一个查询提取丢失的信息并将其保存到我们的DTO并将其传输到UI。 使用implies在一个数据库中运行查询,然后根据第二个数据库中返回的键执行其他查询。

数据库的顺序可能会发生变化,具体取决于用户要应用排序的列(字段)。

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

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

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

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

Spring框架中没有对此体系结构的开箱即用支持,但您可以轻松地隐藏Service层后面的双DataSource对。 您甚至可以为ACID操作配置JTA DataSource

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

所以,总结一下:

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

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

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

我的建议是找到一种方法将2个数据库链接在一起,这样您就可以利用数据库驱动程序功能而不会影响代码。

基本上,如果Progress数据库可以链接到SQL Server,您将能够使用带有id列连接的单个SQL查询来查询这两个数据库,并且您将获得要显示的应用程序的合并,排序和分页结果集。

我不是Progress数据库的专家,但它似乎有一个ODBC驱动程序,所以你可能会尝试将它链接到SQL Server

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM