从应用程序多次调用数据库过程时性能是否会影响?

时间:2016-01-13 09:28:22

标签: c++ multithreading oracle performance oracle-pro-c

在我的项目中,我们使用c ++应用程序调用oracle过程 oracle提供的Pro * C / C ++库的帮助。

我们有一个很大的程序,我的想法是将程序分成两个用于模块化。但他们的建议是将程序称为一次,并一次性完成所有工作。

我从他们那里得到的原因是它会导致性能影响,因为应用程序多次与数据库交互。

我同意,当应用程序连接数据库,调用该过程并最终断开每个过程调用的数据库时,将发生上述情况。但是,我们真正做的是在启动时创建一个连接池,并重用预先连接的数据库连接以与数据库进行交互。

有关我的申请的信息:

  1. 它是multi-threaded application,每秒处理大约1000个请求,并且线程池大小为20.目前,对于每个请求,我们与数据库进行了4次通信。
  2. 修改

    " PLSQL和SQL之间的切换比其他方式快得多#34; Q1。这是怎么回事与我的实际问题有关?我的问题是将程序分为两个部分。假设我在程序中执行了4个查询,我只是将其分为两个作为过程a和过程b,并且每个过程将有两个查询。

    " pro * c调用哪些调用PLSQL是一个性能命中"。 Q2。你的意思是应用程序(pro * C / C ++)和数据库(oracle)之间的通信吗?如果是这样,沟通是否会受到重大影响?

    在你附加的问题tom链接中,"但是不要害怕从PLSQL调用SQL - 这就是PLSQL最擅长的#34; Q4。当我们从PLSQL调用SQL时会发生Wheather上下文切换?因为,按照上述说法,似乎没有对性能产生影响。

1 个答案:

答案 0 :(得分:1)

您的建议是正确的,最好一次执行所有数据库任务。您的方案中有两个主要的性能影响

  1. SQL引擎和PL / SQL引擎之间的pro * c上下文切换,以多次运行您的线程。通常是来自客户端应用程序的许多PL / SQL调用中的最大问题。
  2. 您的专业应用和数据库引擎之间通信中的网络堆栈开销(TNS) - 特别是如果您的应用位于不同的物理主机上。
  3. 话虽如此,您在应用程序端创建了一个连接池,TNS监听器还应该有一个等待每个网络连接的遗留服务器影子进程池(这是在listener.ora中设置的)。

    当影子进程已经等待连接时,OCI登录/注销非常快,并且不是延迟的重要因素 - 我不担心这个,除非服务器上的新影子进程必须启动 - 然后它可能是一个非常昂贵的电话。当您在客户端使用连接池时,这通常不是问题,而是因为调用中的线程而需要考虑的事项。一旦耗尽了服务器影子进程池,如果TNS监听器必须启动更多的服务器影子进程,您会注意到一个巨大的降级。

    编辑以回答新问题:

    1. 这是非常相关的。如前所述,您应该最小化C ++应用程序中的plsql和sql调用量。 C ++应用程序调用中的每个PLSQL调用都会调用SQL引擎,然后SQL引擎会调用PLSQL引擎进行过程调用。因此,如果您将过程拆分为2 - 您将SQL加倍到PLSQL上下文切换,这是Tom Kyte文章和我个人经验所概述的更昂贵的切换。

    2. 在1中回答。但正如我之前所说,除非您的主机位于不同的物理网络和您正在传输的数据类型,否则通信开销是第二位的。例如,大型C ++对象参数和具有多次调用的大型Oracle结果集显然会影响往返的通信延迟。请记住,对于更多PLSQL调用,您还为每个连接和结果集的设置添加了更多SQLNET流量。

    3. 没有3.问题

    4. PLSQL引擎中的PLSQL to SQL可以忽略不计,所以不要挂断它。将所有SQL调用放在1个PLSQL调用中,以获得最大的性能吞吐量。不要将电话分开,只是为了在昂贵的表现上更加雄辩。