[英]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.