1

我们有一个使用 OCI 的应用程序,但我们似乎无法使预取工作。

我们对一个包含十几个列的表进行选择查询(其中一个 CLOB 列和一个MDSYS.GEOMETRY列)。CLOB 列在 99% 的情况下小于 4000 字节,甚至在 50% 的情况下为空。

流程如下:

  • 我们设置OCI_ATTR_PREFETCH_ROWS为 500
  • 我们将列绑定到输出缓冲区,CLOB 直接绑定到 8000 字节的文本缓冲区
  • 对于 CLOB 句柄,我们设置OCI_ATTR_LOBPREFETCH_SIZE为 8000
  • 我们OCISTMTEXECUTE与 iters 1 一起使用,因为一行被提取到缓冲区中。

现在,如果我们查看 WireShark,我们会看到网络数据包永远不会被填充(每次往返只有一条记录)。

如果我们使用 SQLDeveloper 执行相同的选择查询,那么数据包会很好地填充,因此我们可以假设行预取应该可以工作。

我们在这里缺少什么?

4

1 回答 1

1

由于我最近遇到了同样的问题: 不要一起工作OCI_ATTR_PREFETCH_ROWSOCI_ATTR_LOBPREFETCH_SIZE

来自Oracle 文档:

如果 LONG、LOB 或不透明类型列(例如 XMLType)是查询的一部分,则预取无效。

只要结果集中有 LOB,就不能通过 OCI_ATTR_PREFETCH_ROWS 使用隐式预取,而是需要通过调用行数 > 1 的 OCIStmtFetch2() 来使用显式行提取。当然,您需要提前设置缓冲区,跟踪已经使用的行,尤其需要调用 OCIDefineArrayOfStruct() 来通知 oracle 您的缓冲区布局。

于 2015-07-08T10:18:37.533 回答