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

标签 performance oracle jdbc plsql prepared-statement

我必须使用 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/

相关文章:

c# - 如何使用 ODP.Net 传递字节数组?

java - 噩梦般的 java 泄漏...使用循环和 jdbc

jdbc - 插入选择不起作用

java - 从 java 调用 scala - 性能?

java - 为什么使用排序(O(n log n) 复杂度)比使用 HashMap(O(n) 复杂度)更快地找到多数元素?

sql - 哪个查询的性能更好?

database - 触发器执行期间出现未知错误

java - Java MySQL 连接器中的 DELETE 语句有任何已知问题吗?

python - ImageGrab.grab() 方法太慢

C++读取大数据,解析,然后写入数据