所有。我们已经安装了Oracle RAC集群,并且正在使用TAF在SELECT上测试RAC故障转移。我们使用OCI驱动程序即时客户端版本11.2和带有2个副本节点的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
非常感谢,
路卡
这是预期的行为。如果LOB列是选择列表的一部分,则故障转移将不起作用。
在这种情况下,您可能需要手动重新运行查询(请参阅文档)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句