首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从应用程序多次调用数据库过程时,性能是否会受到影响?

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

Stack Overflow用户
提问于 2016-01-13 09:28:21
回答 1查看 324关注 0票数 1

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

我们有一个大的过程,我的想法是为了模块化,把这个过程分成两个。但是他们的建议是一次性调用这个程序,并一次完成所有的工作。

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

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

关于我的应用程序的信息:

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

编辑:

“PLSQL和SQL之间的转换要比相反的快得多”。Q1。这和我的实际问题有什么关系?我的问题是把一个程序分成两个相等的部分。假设我在过程中执行了4个查询,我只是将其分成两个过程a和过程b,每个过程都有两个查询。

“调用PLSQL的pro*c调用是性能上的问题”。Q2。您是指应用程序(pro *C/C++)和数据库(Oracle)之间的通信吗?如果是这样的话,通信是一个大的性能打击吗?

在ask tom链接中,您附加了“但是不要害怕从PLSQL调用SQL --这是PLSQL做得最好的”Q4。当我们从PLSQL调用SQL时,Wheather上下文切换会发生吗?因为,根据上面的说法,它似乎没有性能影响。

EN

回答 1

Stack Overflow用户

发布于 2016-01-14 02:47:57

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

  1. pro*c在SQL引擎和PL/SQL引擎之间的上下文切换,以多次运行线程。通常,来自客户端应用程序的许多PL/SQL调用中最大的问题。
  2. pro*c应用程序与数据库引擎之间的通信中的网络堆栈开销(TNS) --特别是当应用程序位于不同的物理主机上时。

话虽如此,您正在应用程序结束时创建一个连接池,TNS侦听器还应该有一个遗留的服务器影子进程池等待每个网络连接(这是在listener.ora上设置的)。

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

编辑:回答新问题:

  1. 这是非常相关的。如前所述,您应该尽量减少C++应用程序中的plsql和sql调用量。C++应用程序调用中的每个PLSQL调用都会调用SQL,后者会为过程调用调用PLSQL。因此,如果您将您的过程分成2-您是加倍的SQL到PLSQL上下文开关,这是一个更昂贵的开关概述汤姆凯特的文章和我自己的个人经验。
  2. 但正如我之前所说的,除非您的主机位于不同的物理网络上,而且您正在传输的数据类型不同,否则通信开销是第二位的。例如,使用大量调用的大型C++对象参数和大型Oracle结果集将明显影响往返行程的通信延迟。请记住,使用更多的PLSQL调用,您还将为每个连接和结果集的设置添加更多SQLNET通信量。
  3. 没有问题。
  4. PLSQL到SQL在PLSQL引擎中可以忽略不计,所以不要挂掉它。将所有SQL调用放在一个PLSQL调用中,以获得最大的性能吞吐量。不要为了更雄辩地谈论表演的昂贵而把电话分开。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34762829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档