2009-06-08 66 views
1

我遇到了一个简单的数据导入器/更新程序的问题,它从Informix获取数据,将其插入到Oracle中的表中,并更新原始表中的标志。集合起来是这样的与连接到Informix的Oracle失去远程代理错误的RPC连接

Pro*C program calls a PL/SQL procedure 
The procedure 
    opens a cursor on Informix, 
    loops through each row 
    insert the data into an oracle table 
    commit 
    update the "new data" flag in Informix (i.e. stop a re-import) 
    commit 

两个提交是必要的,停止特定Oracle错误(我忘了是哪一个,但因为要更新的表在两个数据库和一个承诺不能处理它)。 此代码适用于源表中的少量记录(5-10),但在大于1000时会下降。Oracle日志目录中的警报日志显示错误“丢失的RPC连接到远程代理”。 Informix目录中没有相应的错误,所以我怀疑驱动程序有问题。我们正在使用Oracle 10.2和Red Hat上的unixODBC驱动程序。

有没有人有任何想法的解决方法或实际上如何解决它?似乎没有关于此错误消息的任何有用信息 - 大多数页面只是沿着“这不是Oracle问题”的说法。

回答

1

通常,COMMIT会关闭打开的游标。您可能需要在Informix上使用WITH HOLD(ESQL/C术语 - 您必须转换为ODBC)游标。你可能会因为缓冲而得到一些行;一次读取操作可能会从Informix中收集多个(可能超过10个)记录,并且只有当光标关闭时,您才会注意到需要更多时间返回数据库的问题。

我并不完全适应这个作为解释; UPDATE plus COMMIT应该将游标标记为关闭。

假设您正在使用Informix ODBC驱动程序(而不是某些其他供应商的Informix ODBC驱动程序),那么您可以在程序启动之前通过在环境中设置SQLIDEBUG = 2:xyz来进行调试。这应该产生一个名称以'xyz _ ###'开头的文件,其中'###'是一些数字序列,可能是十六进制数字。这个文件可以被sqliprint解释。它会告诉你在你的应用程序和Informix数据库服务器之间传递的信息 - 并且可能会向你展示通过线路发送的数据分组等。

+0

感谢您的回复 - 看起来Oracle的默认行为是保持游标打开直到明确关闭,并且可能是驱动程序在Informix中打开/重新打开游标来模拟此游标。我最终通过使用PL/SQL表作为缓冲区解决了这个问题,所以我可以做更少的提交(少100次),这似乎解决了问题。 它仍然不能解释为什么发生问题,但... – 2009-06-09 09:56:16