java - PL/SQL 返回 CLOB 和 JDBC 性能

标签 java sql oracle jdbc clob

我有一个 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 语句中存在的列的大小限制,我不需要这样做。

编辑 - 我想重申 CLOB 是在函数中创建的,它不会读取数据库中的任何 CLOB。它只是连接 VARCHAR2 并将结果作为 CLOB 返回。

最佳答案

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

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

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

关于java - PL/SQL 返回 CLOB 和 JDBC 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12079725/

相关文章:

java - 'require "java"' 语句在 JRuby 脚本中起什么作用?

mysql - 如何在涉及更新语句的查询中连接多个选择语句的结果

java - Oracle JDBC 驱动程序与 Java 9 java.lang.NoClassDefFoundError : Could not initialize class oracle. jdbc.OracleDriver

oracle - Oracle中触发更新,变异错误

java - 如何使用 MongoTemplate 应用多个标准条件

java - GWT 网络应用程序 : How to maintian logged in state?

sql - 如何更改 Amazon Redshift 中的默认时区?

oracle - 如何从表中分离分区并将其附加到oracle中的另一个?

java - java中如何将数组作为参数?

php - 在论坛中实现帖子阅读标志的最佳方式?