2014-01-27 44 views
3

全部。 我們有一個Oracle RAC集羣安裝,我們正在使用TAF來測試SELECT上的RAC故障轉移。我們使用OCI驅動程序即時客戶端版本11.2,以及具有2個副本節點的RAC。使用CLOB查詢的Oracle RAC故障切換

我們試着用C編寫的簡單的基於OCI的應用程序連接到我們的數據庫,並從表中檢索所有記錄。如果我們不在SELECT中包含CLOB列,那麼一切正常。

如果我們在CLOB列上執行SELECT,並且遍歷結果集以打印其內容,OCI驅動程序似乎無法在節點關閉時正確恢復查詢。

以下錯誤代碼被一致提出:

ORA-25408: can not safely replay call 

期間要麼OCILobLocatorIsInit/OCILobGetLength/OCILobRead。

發生此錯誤後,OCIStmtFetch上的迭代恢復,但獲得故障轉移異常的記錄不會恢復。

這是OCI驅動程序故障轉移實施的預期行爲嗎? 或者我們是否需要修改/增強從CLOB中檢索緩衝區數據的方式?

這是OCI的文檔片斷要求我們使用:

checkerr(errhp, 
    OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, 
        (OCISnapshot*)NULL, (OCISnapshot*)NULL, (ub4)OCI_DEFAULT), 
    __LINE__); 

do { 
    checkerr(errhp, 
     OCILobLocatorIsInit((dvoid*)envhp, errhp, lobl, &flag), 
     __LINE__); 

    checkerr(errhp, 
     OCILobGetLength(svchp, errhp, lobl, &loblen), 
     __LINE__); 

    amtp = loblen; 

    checkerr(errhp, 
     OCILobRead(svchp, errhp, lobl, &amtp, 1, (dvoid*)buf, 
       (loblen < MAX_SIZE ? loblen : MAX_SIZE), 0, 0, 0, SQLCS_IMPLICIT), 
     __LINE__); 

    buf[amtp]='\0'; 
    printf("value=%d, text=%s\n", custno, buf); 
} while (
    (status = OCIStmtFetch(stmthp, errhp, (ub4)1, (ub4)OCI_FETCH_NEXT, (ub4)OCI_DEFAULT)) == OCI_SUCCESS || 
    status == OCI_SUCCESS_WITH_INFO); 

典型的程序輸出類似於:

value = 306, text=ID_#306 
value = 307, text=ID_#307 
Error - ORA-25408: can not safely replay call 
value = 308, text= 
value = 309, text=ID_#309 

非常感謝,

盧卡。

回答