【问题标题】:PL/SQL package call via JDBC performance issue通过 JDBC 性能问题调用 PL/SQL 包
【发布时间】:2012-05-05 22:11:44
【问题描述】:

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

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

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

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

所以现在我的问题是:

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

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

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

【问题讨论】:

  • 包体有 Begin - End 部分?
  • 是的,它有开始和结束部分。
  • 并发怎么样?多个进程是否同时使用相同的程序?
  • 如果从例如 SQL*Plus 而不是 Java 调用过程,您是否看到相同类型的延迟?换句话说,是 JDBC 导致的速度变慢还是只是包运行缓慢?
  • 使用等待事件设置跟踪并查看原始跟踪文件中显示的内容。运气好的话,它会提供线索。

标签: performance oracle jdbc plsql prepared-statement


【解决方案1】:

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

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

一个:

"第一次调用程序包的过程占了90%以上 一组时间。 ....如果我先调用另一个程序 定位这个占 90%"

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

两个:

" 我在pl/sql developer中使用了profiler,执行非常 那里快。 "

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2018-01-29
    • 2022-06-15
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多