我必须使用PL / SQL包作为API将数据导入Oracle数据库。我在Java应用程序中使用最新的ojdbc驱动程序执行此操作。我在导入期间使用的所有语句(原因为PreparedStatements)仅初始化一次并重新用于要导入的每个集合。
现在我面临以下问题:第一次调用程序包的过程占用了一组的90%以上的时间。我必须在导入过程中调用大约10个程序,第一个过程大约需要4秒,其余大约需要0.4秒。如果是导入第一个程序调用的第10个或第100,000个集合,那么无论如何需要花费那个时间。
重要的是要知道,如果我在第一个位置调用另一个程序,那么这个程序需要90%。所以,可能是我错了,它是关于包初始化的东西?但是,如果我(重新)使用预备语句,那么这不应该只在第一次调用时发生吗?
PL / SQL包有大约10,000行代码,并且在导入过程中还会调用其他几个包。
所以现在我的问题是:
出现此问题的可能原因是什么?什么是潜在的解决方案? 我可以使用任何工具来识别记者吗?
编辑:我可以确定导入缓慢的原因。它与错误的代码或其他东西无关。原因只是我在测试场景中使用的数据类型。我的错误是导入了相同的数据。
如果线程1在第一个过程中对数据集进行了更新,则它在此行上持有一个锁,直到完成导入后的提交。线程2到n试图更新完全相同的行。结果是有效地同步所有线程。
答案 0 :(得分:3)
首先,这不正常。所以你的代码肯定存在一些问题。但是,如果没有能够看到您的来源,我们就无法发现问题。坦率地说,我不想调试10000 LOC,甚至不是我的,更不用说你的了。抱歉。
所以我们能做的最好的就是给你一些指示。
<强>一:强>
“该程序包的第一次调用占用了90%以上的程序 一套时间。 ....如果我先打电话给另一个程序 这个位置占据90%“
也许有一些常见的编码,每个过程执行的行为都有所不同,具体取决于调用过程是否是在任何给定运行中执行它的第一个过程。你需要找到那个流氓代码。
二:
“我在pl / sql开发人员中使用了分析器。执行非常好 那里很快。 “
您的程序行为会有所不同,具体取决于您是从JDBC的PL / SQL Developer调用它。因此,很有可能问题不在于PL / SQL代码,而在于JDBC代码。获取数据库连接绝对是一个潜在的痛苦来源。在您的体系结构上,网络流量可能是另一个问题:您是否将大量数据返回到Java程序,然后在后续程序调用中使用?
简而言之:您要么需要识别PL / SQL代码中常见的内容,这些内容可能会在不同的程序调用中产生相同的结果,或者在PL / SQL Developer和JDBC中调用程序时识别出不同的结果。