gpt4 book ai didi

java - 在 Oracle 中获取多个 blob

转载 作者:太空宇宙 更新时间:2023-11-04 15:23:00 27 4
gpt4 key购买 nike

我们在 Oracle 表中以序列化形式存储数据。保存序列化数据的列是 BLOB 类型。我们确实有一个存储过程来查询表并将结果作为 sys_refcursor 返回。存储过程接受以逗号分隔形式的键列表,要为其获取 blob。

环境 - JRE 1.6甲骨文11g

问题:当应用程序请求 8 或 10 行数据时,我们希望存储过程在单个数据库往返中返回带有二进制数据的所有结果行。这可能吗?或者以最少的数据库往返次数获取结果的最佳方法是什么。

(我们已将 fetchRowsize 设置为 10,以便提取多行。我们还将 setLOBPrefetchSize 设置为足够大的值(3 Meg)。但是这些似乎没有什么区别。 resultSet.getBytes()花费大量时间表明数据是根据请求获取的)

我错过了什么?我们是否有任何跟踪来启用/检查下面发生了什么?

最佳答案

BLOB 有意触发某些特定行为,因为它们可能非常大(取决于 block 大小,但最大大小至少为 8 TB)。驱动程序并不总是事先知道将传输多少数据,因此驱动程序默认采用安全路线。

据我所知,您希望它只需一次往返即可完成,可能是因为您的网络延迟?如果没有,请说明。

我们开发的标准软件包也遇到了同样的问题,在该软件包中,客户端在连接设置时检索全局范围内的大量数据。我们已解决如下:

  1. 最初,我们使用了一个存储过程,该过程采用带有最后检索的数据行的哈希值的参数。存储过程检查当前数据行的哈希值。如果没有不同,它只返回一个 header 。如果不同,它会将所有内容组合成一大块并将其发回。通过这种方式,它可以避免在全局范围内传输大量信息,因为高网络延迟通常伴随着低带宽。而且往返次数也减少了。
  2. 过去两年,我们在两者之间插入了我们公司的不同产品(网络服务提供商)。它自行进行压缩和重复数据删除,并进一步减少带宽需求。另外,它仅在 Web 服务和 Oracle RDBMS 之间使用 SQL*Net。 Web服务使用bson(二进制格式的json)进行通信。

由于劳动力成本较低,我建议仅从存储过程中返回一个 LOB(其中包含所有内容)。甚至可能对其进行压缩或使用客户端缓存。

上述选项 2 需要花费更多的精力来引入。

关于java - 在 Oracle 中获取多个 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20210646/

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