我们正在设计一个相当大的棕色地块应用程序,并遇到一些问题。
我们在DB2数据库中从仍在加载数据的遗留应用程序中获得了大量信息。我们还在我们控制的Oracle数据库中提供信息。
我们必须对表执行'JOIN'类型的操作。现在,我正在考虑将信息从DB2表中提取到List<>中。然后将它们迭代到Oracle数据库上的SQL语句中,例如:
select * from accounts where accountnum in (...)
是否有更简单的方法在数据库之间进行交互,或者至少,这种行为的最佳做法是什么?
答案 0 :(得分:1)
我已经做到了这两种方式。
在不同的盒子上有两个Sybase数据库,我设置了存储过程,然后像函数一样调用来回传送数据。这还允许sprocs进行审核/记录,以说服客户在此过程中没有数据丢失。
在Oracle到Sybase的一种方式中,我使用了一个视图来编组数据,并使用C ++程序调用每个供应商的C库,这些程序为C API提供了一个通用接口。
在MySQL和DB2设置中,就像你的情况一样,Db2是“遗留但现场”,我采用了类似于你所描述的设置:将数据拉入(Java)客户端程序。
如果连接始终是一对一的,并且每个框的结果集具有相同的键,则可以使用相同的顺序将它们拉出,并在客户端中轻松连接它们。即使它们是一对多的,将它们拼接在一起只是两个列表的单向迭代。
如果它变为多对多,那么我可能会回退到一次处理一个项目(尽管你可以使用HashSet查找)。
但基本上,您的选择是sprocs(您需要和客户端层),或者只是在客户端中进行。
答案 1 :(得分:1)
您可以以平面文件格式从DB2导出数据,并将此平面文件用作外部表或使用sql loader,这是一个批处理过程。
还有一种称为异构连接的东西。在这里,您可以创建从Oracle到DB2的数据库链接。这使得可以实时查询DB2数据库,并且可以将Oracle表与DB2表连接。
您还可以将此数据库链接与物化视图结合使用。
有不同类型的异构连接,因此请仔细阅读文档。
答案 2 :(得分:1)
它必须是实时数据吗?如果是这样,有些产品可用于异构连接,尤其是db2关系连接,它是联合服务器的一部分。如果接受延迟,则可以设置脚本以将数据复制到oracle,您可以使用该脚本执行本机连接。 将数据提取到客户端应用程序会导致性能下降。如果这是唯一的选项,请尝试创建db2存储过程以返回将使性能稍好的数据。
答案 3 :(得分:0)
如果可以将数据从旧数据库复制到您控制的数据库,您可以考虑将数据提取作业每天(或尽可能多地)从旧数据库复制一次(或尽可能多地)到Oracle DB。如果您无法识别自上次数据加载以来在旧数据库中生成的新记录,那可能不是那么简单。
然后,您可以在Oracle实例中执行连接。
答案 4 :(得分:0)
如果您询问供应商,可能最好的做法是购买另一种产品。
从IBM方面来看,有IBM Federation Server,它可以“将来自不同来源(如DB2,Oracle和SQL Server)的数据合并到一个虚拟视图中。”我想也有一个来自Oracle,但我对他们的产品不熟悉。
答案 5 :(得分:0)
请注意,如果您拥有DB2 Advanced Enterprise Server Edition(AESE),则包含Infosphere Federation Server。
这两种产品都允许您使用发送到一个DB的单个连接查询,该DB从两个DB返回数据。 Oracle产品非常好用,它允许Oracle将DB2数据库视为另一个Oracle数据库,并使DB2将Oracle数据库视为另一个DB2数据库。 (感谢IBM发布了DB2使用的DRDA协议的客户端和服务器端的规范。太糟糕了,没有其他供应商愿意这样做,尽管他们没有利用IBM这样做的事实。)
这两种产品都不是我所说的廉价产品。
为了便宜,您可以利用Oracle Database Gateway for ODBC
http://docs.oracle.com/cd/E16655_01/gateways.121/e17936/toc.htm