【问题标题】:PL/SQL returning CLOBs and JDBC performancePL/SQL 返回 CLOB 和 JDBC 性能
【发布时间】:2012-08-18 06:23:25
【问题描述】:

我有一个 PL/SQL 函数可以从 MySQL 复制 GROUP_CONCAT()。该函数接受一个 CURSOR 并返回一个 VARCHAR2。但是,我的应用程序中有一些对象有足够的数据,连接字符串的大小大于 4000。由于我在 SELECT 语句(而不仅仅是 PL/SQL)中使用了这个函数,这让 Oracle 很生气并抛出了 ORA -06502.

所以,我将函数改为返回 CLOB。这可以解决错误,但是当使用 JDBC 读取数据时,性能会受到很大影响。我正在读取大量数据并从 VARCHAR2 切换到 CLOB 导致执行时间降低 10-20 倍。我一直在研究以某种方式对此进行优化,但是由于 CLOB 是从函数返回的并且不在表中,所以我读过的大部分内容都不适用。

有什么办法可以改善吗?我想强调的是,这与实际数据库的性能没有任何关系。连接最多 4000 个字符的值非常快,只有少数对象需要超过 4000 个字符,最大的值在 5000 个字符左右。 LOB 通常针对大型原始数据进行优化,如果不是 Oracle 对 SELECT 语句中存在的列的大小限制,我不需要这样做。

EDIT - 我想重申 CLOB 是在一个函数中创建的,它没有读取数据库中的任何 CLOB。它只是连接 VARCHAR2 并将结果作为 CLOB 返回。

【问题讨论】:

标签: java sql oracle jdbc clob


【解决方案1】:

您可以在返回之前将 CLOB 转换为 VARCHAR。 PLSQL 中 VARCHAR 的最大大小为 32k。如果 32k 不够大,请将结果存储到临时表中并使用 JDBC 从中读取。这将比通过 CLOB 网络协议更快。

【讨论】:

    【解决方案2】:

    我不知道如何解决您的问题.. 但是最小化您的问题的一种方法是拥有 2 个版本的函数。 1个返回varchar2,1个返回clob

    如果值长于 4000/32000 个字符,您的 varchar2 版本可能会在内部使用 clob 版本并返回异常代码/引发错误

    然后,您的 java 代码可以检测到这一点,并为少数需要它的情况直接重新调用 clob 版本。

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 2011-02-07
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2016-02-28
      • 2019-04-11
      相关资源
      最近更新 更多