我必须使用 PL/SQL 包作为 API 将数据导入 Oracle 数据库。我正在使用最新的 ojdbc 驱动程序在 Java 应用程序中执行此操作。我在导入期间使用的所有语句(原因是 PreparedStatements)仅初始化一次,并在每个要导入的集合中重复使用。
现在我面临以下问题:程序包的第一次调用占用了一组时间超过 90% 的时间。在导入过程中我必须调用大约 10 个程序,第一个大约需要 4 秒,其余大约 0.4 秒。不管是第 10 组还是第 100,000 组导入第一个过程调用总是需要那个时间。
重要的是要知道,如果我在第一个位置调用另一个程序,这将占用 90%。那么,可能是我错了,是关于包初始化的吗?但是,如果我(重新)使用准备好的语句,那不应该只在第一次调用时发生吗?
PL/SQL 包有大约 10,000 行代码,并且在导入过程中还会调用其他几个包。
所以现在我的问题是:
这个问题的可能原因是什么?什么是潜在的解决方案?有什么工具可以用来识别原因吗?
编辑:我可以确定导入缓慢的原因。它与错误的代码或其他东西无关。原因只是我在测试场景中使用的那种数据。我的错误是始终导入相同的数据。
如果线程一在第一个过程中对数据集进行了更新,它会在该行上保持锁定,直到完成导入后的提交。线程二到 n 试图更新完全相同的行。结果实际上是所有线程的同步。