【问题标题】:Retrieve information for the same DTO from two different databases从两个不同的数据库中检索相同 DTO 的信息
【发布时间】:2015-06-13 20:01:40
【问题描述】:

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

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

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

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

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

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

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

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

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

注意:将数据从一个数据库移动到另一个数据库不是一种选择。

【问题讨论】:

  • 你看过 Hibernate 多租户支持吗?
  • 我已经阅读过它,但似乎是一种从两个不同来源检索信息的策略(Spring routingDataSource 与此类似),在这种情况下,我对数据库没有问题更多的是我需要根据列进行排序的下一步,但该列可能位于第一个或第二个数据库中。所以完整的信息取决于第一个查询添加第二个查询的信息
  • @Koitoer 两个数据库中表的大小是多少?
  • 大小超过10000条记录

标签: java spring hibernate jpa spring-data-jpa


【解决方案1】:

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

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

【讨论】:

  • 目前看来,基本上春天没有开箱即用的支持,这让你得到了正确的答案,谢谢。可能在未来这将是一个新功能,谁知道呢
【解决方案2】:

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

所以,总结一下:

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

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

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

【讨论】:

  • 要做到这一点,我认为我需要将所有记录加载到应用程序并在内存中排序,移动我认为效率低下的数据量
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多