gpt4 book ai didi

performance - 通过 JDBC 性能问题调用 PL/SQL 包

转载 作者:行者123 更新时间:2023-12-04 05:49:04 27 4
gpt4 key购买 nike

我必须使用 PL/SQL 包作为 API 才能将数据导入 Oracle 数据库。我正在使用最新的 ojdbc 驱动程序在 Java 应用程序中执行此操作。我在导入过程中使用的所有语句(由于 PreparedStatements)仅初始化一次,并在要导入的每个集合中重复使用。

现在我面临以下问题:包的程序的第一次调用占用了一组超过 90% 的时间。在导入过程中我必须调用大约 10 个过程,第一个过程大约需要 4 秒,其余大约 0.4 秒。无论是第 10 个还是第 100,000 个集导入第一个过程调用都需要该时间。

重要的是要知道,如果我在第一个位置调用另一个程序,这将占用 90%。那么,可能是我错了,这与包初始化有关?但是如果我(重新)使用准备好的语句,那不应该只在第一次调用时发生吗?

PL/SQL 包有大约 10,000 行代码,并且在导入过程中还会调用其他几个包。

所以现在我的问题是:

此问题的可能原因是什么?什么是潜在的解决方案?
有什么工具可以用来确定原因吗?

编辑:我可以确定导入缓慢的原因。它与错误的代码或其他什么无关。原因只是我在测试场景中使用的数据类型。我的错误是始终导入相同的数据。

如果线程一在第一个过程中对数据集进行了更新,则它会在该行上保持锁定,直到完全导入后提交。线程 2 到 n 试图更新完全相同的行。结果实际上是所有线程的同步。

最佳答案

首先,这是不正常的。所以你的代码肯定有问题。但是如果无法看到您的来源,我们就无法发现问题。坦率地说,我不想调试 10000 个 LOC,甚至不是我的,更不用说你的了。对不起。

所以我们能做的最好的事情就是给你一些指示。

一:

"The first call of an procedure of the package takes over 90% of the time for one set. .... if I'm calling another procedure on first position this on takes the 90%"



也许有一些共同的代码片段,每个过程执行的行为取决于调用过程是否是在任何给定运行中第一个执行它的过程。您需要找到该流氓代码。

二:

" I've used the profiler in pl/sql developer. The execution is very fast there. "



您的程序的行为取决于您是否从 JDBC 的 PL/SQL Developer 调用它。因此,问题很可能不在于 PL/SQL 代码,而在于 JDBC 代码。获取数据库连接绝对是一种潜在的痛苦来源。根据您的架构,网络流量可能是另一个问题:您是否向 Java 程序返回了大量数据,然后在随后的过程调用中使用这些数据?

简而言之:您要么需要确定 PL/SQL 代码中可能在不同程序调用中导致相同结果的共同点,要么需要确定在 PL/SQL Developer 和 JDBC 中调用程序时发生的不同情况。

关于performance - 通过 JDBC 性能问题调用 PL/SQL 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10312058/

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