1

我们正在设计一个相当大的棕地应用程序,并遇到了一些问题。

我们在 DB2 数据库中拥有来自仍在加载数据的遗留应用程序的大量信息。我们在我们控制的 Oracle 数据库中也有信息。

我们必须对表执行“JOIN”类型的操作。现在,我正在考虑将 DB2 表中的信息提取到 List<> 中,然后将它们迭代到 Oracle 数据库上的 SQL 语句中,例如:

select * from accounts where accountnum in (...)

有没有更简单的方法在数据库之间进行交互,或者至少,这种操作的最佳实践是什么?

4

6 回答 6

1

我已经做到了这两种方式。

在不同的机器上使用两个 Sybase 数据库,我设置了存储过程,然后调用 like 函数来来回发送数据。这还允许存储过程审计/记录,以说服客户在此过程中没有数据丢失。

在 Oracle 到 Sybase 的一种方式中,我使用视图来编组数据和每个供应商的 C 库,这些库是从 C++ 程序调用的,该程序为 C API 提供了一个通用接口。

在 MySQL 和 DB2 设置中,与您的情况一样,Db2 是“旧版但仍然存在”,我采用了类似于您所描述的设置:将数据提取到(Java)客户端程序中。

如果连接始终是一对一的,并且每个框的结果集具有相同的键,则您可以使用相同的顺序将它们拉出并在客户端中轻松连接它们。即使它们是一对多的,将它们拼接在一起也只是两个列表的单向迭代。

如果它是多对多的,那么我可能会退回到一次处理一个项目(尽管您可以使用 HashSet 查找)。

不过,基本上,您的选择是存储过程(您需要和客户端层),或者只是在客户端中进行。

于 2009-04-03T14:08:48.773 回答
1
  1. 您可以从 DB2 中以平面文件格式导出数据并将该平面文件用作外部表或使用 sql 加载器,这是一个批处理过程。

  2. 还有一种叫做异构连接的东西。在这里,您创建了一个从 Oracle 到 DB2 的数据库链接。这使得实时查询 DB2 数据库成为可能,并且您可以将 Oracle 表与 DB2 表连接起来。

您还可以将此数据库链接与物化视图结合使用。

有不同种类的异构连接,因此请仔细阅读文档。

于 2009-04-04T14:19:08.817 回答
1

它必须是实时数据吗?如果是这样,那么有一些产品可用于异构连接,尤其是作为联合服务器一部分的 db2 关系连接。如果延迟被接受,您可以设置脚本以将数据复制到 oracle,您可以使用它进行本机连接。将数据拉到客户端应用程序时性能会很差。如果这是唯一的选择,请尝试创建一个 db2 存储过程来返回数据,这将使性能稍好一些。

于 2009-04-06T00:17:44.453 回答
0

如果可以将数据从遗留数据库复制到您控制的数据库,您可以考虑每天(或尽可能频繁地)将新记录从遗留数据库复制到 Oracle 数据库的数据提取作业。如果您无法识别自上次数据加载以来遗留数据库中生成的新记录,这可能不是那么简单。

然后,您可以在 Oracle 实例中进行连接。

于 2009-04-03T14:19:21.320 回答
0

如果您询问供应商,最好的做法可能是购买另一种产品。

在 IBM 方面,有IBM Federation Server,它可以“将来自不同来源(如 DB2、Oracle 和 SQL Server)的数据组合到一个虚拟视图中”。我想甲骨文也有一个,但我对他们的产品不太熟悉。

于 2009-04-03T15:18:54.610 回答
0

请注意,如果您拥有 DB2 Advanced Enterprise Server Edition (AESE),则包括 Infosphere Federation Server。

这两种产品都允许您使用发送到一个数据库的单个连接查询,该数据库从两个数据库返回数据。Oracle 产品非常棒,因为它允许 Oracle 将 DB2 数据库视为另一个 Oracle DB,并允许 DB2 将 Oracle 数据库视为另一个 DB2 数据库。(感谢 IBM 发布了 DB2 使用的 DRDA 协议的客户端和服务器端的规范。可惜没有其他供应商愿意这样做,尽管他们可以毫无问题地利用 IBM 这样做的事实。)

这两种产品都不是我所说的便宜。为了便宜,您可以利用 Oracle Database Gateway for ODBC
http://docs.oracle.com/cd/E16655_01/gateways.121/e17936/toc.htm

于 2014-01-29T03:19:00.323 回答