为啥 oracle 存储 java 过程中的相同代码可能比普通 java 慢?

Posted

技术标签:

【中文标题】为啥 oracle 存储 java 过程中的相同代码可能比普通 java 慢?【英文标题】:Why could be the same code in oracle stored java procedure slower than in regular java?为什么 oracle 存储 java 过程中的相同代码可能比普通 java 慢? 【发布时间】:2013-05-30 17:28:06 【问题描述】:

我正在开发一个在其他 PL/SQL 过程中调用的存储 Java 过程。在 JAVA 代码中,我需要选择返回 ~5000 行的 ~500 列并处理数据(使用 StAX 生成 XML 到大小约为 8 MB 的 BLOB)。该处理仅具有线性复杂性,并且没有时间或内存昂贵的操作。

当我在桌面上运行代码并连接到远程数据库服务器时,它会在大约 3 秒内运行。当我将程序作为存储的 Java 过程部署到数据库时,它会在大约 14 秒内运行。

我不明白为什么。我希望代码在具有内部 JDBC 驱动程序的数据库上运行得更快,因为没有数据往返。我在代码中所做的唯一更改是获取连接的方式。

有趣的是,Oracle DB 上的代码消耗的内存明显减少,但是当我增加内存限制时,它并没有帮助。

你知道问题出在哪里吗?

我不能做的是:

使用标准的 DB-XML 映射工具,因为这不仅仅是简单的转换,背后还有一些业务逻辑 将算法重写为纯 PL/SQL,因为使用了很多面向对象的功能,并且在程序上编写和维护它太难了 将代码放到应用服务器上,因为这只是 PL/SQL 中数据处理的一个步骤

【问题讨论】:

你试过profile你的pl/sql代码吗? 两边都有哪些 JVM 版本?堆大小设置?您是否尝试过直接调用 java 存储过程(= 不使用 PL/SQL)? 时间~14秒不是整个过程的时间,它只是PL/SQL中一次调用后面的java代码的时间。从 Java 代码中,我不调用任何 PL/SQL 过程,只是一个带有只读只进结果集的大选择。选择在 ~250 毫秒内完成。 【参考方案1】:

您发布的信息未排除的可能性:更快的桌面处理器和/或更高负载下的数据库服务器。

【讨论】:

+1:V. 要检查的基本要点。我很想知道服务器 CPU 是什么,因为最近多核处理器的趋势使我们拥有更多但相对较弱的内核。

以上是关于为啥 oracle 存储 java 过程中的相同代码可能比普通 java 慢?的主要内容,如果未能解决你的问题,请参考以下文章

.NET Oracle Provider:为啥我的存储过程不起作用?

在 Oracle 中调用 Java 存储过程

如何在 Oracle 中调试 Java 存储过程

关于oracle存储过程中的sql拼接,大神进!!!

oracle 存储过程中如何用ROWID

Java 存储过程是不是比 Oracle 中的 PL/SQL 慢?