gpt4 book ai didi

c++ - OCI 预取不工作

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:47 26 4
gpt4 key购买 nike

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

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

过程如下:

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

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

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

我们在这里缺少什么?

最佳答案

因为我最近遇到了同样的问题:OCI_ATTR_PREFETCH_ROWSOCI_ATTR_LOBPREFETCH_SIZE 不能一起工作。

来自 Oracle Docs:

Prefetching is not in effect if LONG, LOB or Opaque Type columns (such as XMLType) are part of the query.

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

关于c++ - OCI 预取不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30815931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com