2009-06-08 50 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