与远程代理的RPC连接丢失Oracle连接到Informix时出错

与远程代理的RPC连接丢失Oracle连接到Informix时出错,oracle,odbc,informix,Oracle,Odbc,Informix,我遇到了一个简单的数据导入器/更新程序的问题,该程序从Informix获取数据,将其插入到Oracle中的表中,并更新原始表中的标志。设置是这样的 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

我遇到了一个简单的数据导入器/更新程序的问题,该程序从Informix获取数据,将其插入到Oracle中的表中,并更新原始表中的标志。设置是这样的

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目录中没有相应的错误,因此我怀疑驱动程序有问题。我们正在使用Oracle10.2和红帽上的unixODBC驱动程序


有没有人对解决方法有什么想法,或者实际上如何解决它?似乎没有关于此错误消息的任何有用信息-大多数页面只是说了一些类似“这不是Oracle问题”的话。

通常,提交会关闭打开的游标。您可能需要将Informix上的游标设置为带有HOLD的游标(ESQL/C术语-您必须转换为ODBC)。由于缓冲,可能会有几行工作;一次获取操作可能会从Informix中收集多条(可能超过10条)记录,只有当光标关闭时,您才会在返回数据库获取更多记录时注意到问题

作为一种解释,我并不完全满意;UPDATE plus COMMIT应将光标标记为已关闭


假设您使用的是Informix ODBC驱动程序(与其他供应商针对Informix的ODBC驱动程序相反),那么您可以在程序启动之前在环境中设置SQLIDEBUG=2:xyz来调试它。这将生成一个文件,其名称以“xyz######”开头,其中“####”是一些数字序列,可能是十六进制数字。然后可以通过
sqliprint
来解释此文件。它将向您显示应用程序和Informix数据库服务器之间传递的信息,并很可能向您显示通过网络发送的数据分组等。

通常,提交会关闭打开的游标。您可能需要将Informix上的游标设置为带有HOLD的游标(ESQL/C术语-您必须转换为ODBC)。由于缓冲,可能会有几行工作;一次获取操作可能会从Informix中收集多条(可能超过10条)记录,只有当光标关闭时,您才会在返回数据库获取更多记录时注意到问题

作为一种解释,我并不完全满意;UPDATE plus COMMIT应将光标标记为已关闭


假设您使用的是Informix ODBC驱动程序(与其他供应商针对Informix的ODBC驱动程序相反),那么您可以在程序启动之前在环境中设置SQLIDEBUG=2:xyz来调试它。这将生成一个文件,其名称以“xyz######”开头,其中“####”是一些数字序列,可能是十六进制数字。然后可以通过
sqliprint
来解释此文件。它将向您显示应用程序和Informix数据库服务器之间传递的信息,并很可能向您显示通过网络发送的数据分组等。

感谢您的回复-Oracle上的默认行为似乎是保持光标打开,直到显式关闭,可能是驱动程序在Informix中打开/重新打开光标来模拟这种情况。最后,我通过使用PL/SQL表作为缓冲区来解决这个问题,这样我可以做更少的提交(减少100次),这似乎解决了这个问题。尽管如此,它仍然没有解释问题发生的原因…感谢您的回复-Oracle上的默认行为似乎是保持光标打开直到显式关闭,可能是驱动程序在Informix中打开/重新打开光标来模拟这种情况。最后,我通过使用PL/SQL表作为缓冲区来解决这个问题,这样我可以做更少的提交(减少100次),这似乎解决了这个问题。但它仍然无法解释问题发生的原因。。。