2012-12-20 136 views
2

當我嘗試重新運行鍼對IBM DB2 9.1版本的查詢時,我總是收到以下錯誤消息。DB2 - CLI0108E通信鏈路故障。 SQLSTATE = 40003

CLI0108E通信鏈路故障。 SQLSTATE = 40003

查詢是updateinglarge集recordss(超過50000記錄)。

  • 我也嘗試改變超時爲「0」查詢執行

    但是這並沒有幫助。

此外,我的db2cli.ini文件沒有任何超時詳細信息。我應該添加什麼嗎?

請指教。

+1

Sory,我的原始答案不完整。我做了更多的挖掘,我只是更新了我的答案,我希望對你更有用。 – David

回答

4

CLI0108E僅僅意味着連接被打破。從​​:

CLI0108E通信鏈路故障。

說明執行此功能時,驅動程序和數據源之間的連接失敗。

用戶響應建立新的連接。


的的SQLState(40003)表明DB服務器無法判斷語句是否沒有成功完成。 (SQLState消息及其含義的文檔可以在這裏找到:http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=%2Fcom.ibm.db2.udb.msg.doc%2Fdoc%2Fr0sttmsg.htm

值在此範圍:發生

  • 40001死鎖或超時自動回滾
  • 40003的語句完成是未知的。
  • 40504系統錯誤導致工作單元回滾
  • 40506當前事務由於SQL錯誤而回退
  • 40507當前事務被回滾作爲故障創建索引的結果。

CLI0108E可以有任意數量的原因:關閉連接問題在網絡中,客戶端或服務器由於超時,有人在機房踢電纜,你的名字。我甚至看到的是在我們的環境中,因爲有與虛擬NIC卡有問題,它是由重新安裝驅動程序固定在特定的VM主機上運行的虛擬服務器得到這個錯誤。可能的原因列表是出奇的大,但一個好的網絡管理應能提供幫助。(使用嗅探器監控數據包是在所有其他情況都失敗時跟蹤源的好方法。)

如果可以,重構代碼以上傳較小的集合可能並不會造成影響。假設您有10,000條記錄,請嘗試一次上傳一千條記錄,十次查看是否有幫助。

另一種在服務器完全不可靠的情況下使用(一次)的方法是隻嘗試一次插入一條記錄。

僞代碼:(假設一個連接對象命名爲「連接」,並使用該連接名爲「CMD」命令對象......)

connection.Open() 

for each record 
    try 
     cmd.CommandText ="whatever changes need to be made" 
     cmd.Execute() 
    catch(Exception ex) 
     if(the exception is a communication link failure) 
     connection.Open() 
     cmd.Execute() 
     else 
      handle different errors accordingly 
     end if 
    end try 

next 

但這種方法有性能問題,是凌亂的,仍然可能會失敗的嘗試重新打開連接失敗。儘管我已經在使用它,但我不建議它是長期的。 (一旦原始問題得到解決,我就擺脫了這種方法。)你試圖追蹤斷開連接的根本原因要好得多。

在你的情況下,它可能的原因可能是你試圖一次上傳太多的數據。我懷疑它,但它是可能。重構代碼以更小的塊發送數據肯定會是我的第一選擇,我是你的鞋子。

+0

非常感謝您的意見。我試圖減少上傳的記錄塊,並且從另一個用戶機器測試這個記錄。我還沒有嘗試重新打開連接。但是,如果連接失敗,我應該會收到一條錯誤消息,指出連接丟失到服務器或這些線路上的某些東西了! – JJunior

+0

我改變了commandtimeout = 0你會建議改變連接超時= 0嗎? – JJunior

+0

完成將所有DB2內容寫入sql表並關閉DB2連接。它有助於解決連接超時問題。在我的情況下,打破DB2查詢導致超時。所以一次執行查詢,然後寫入sql表。 – JJunior

相關問題