2

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

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

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

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

所以现在我的问题是:

这个问题的可能原因是什么?什么是潜在的解决方案?有什么工具可以用来识别原因吗?

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

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

4

1 回答 1

3

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

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

一:

“程序包的第一次调用占用了一组时间超过 90% 的时间。....如果我在第一个位置调用另一个程序,这将占用 90%”

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

二:

" 我在 pl/sql developer 中使用了分析器。那里的执行速度非常快。"

您的程序的行为会有所不同,具体取决于您是否从 JDBC 的 PL/SQL Developer 调用它。所以很有可能问题不在于 PL/SQL 代码,而在于 JDBC 代码。获取数据库连接绝对是一种潜在的痛苦来源。取决于您的架构,网络流量可能是另一个问题:您是否将大量数据返回给 Java 程序,然后用于后续的过程调用?

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

于 2012-04-25T15:10:44.107 回答