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

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

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

我们有一个大程序,我的想法是将程序一分为二以实现模块化。但他们的建议是一次调用该过程,一次完成所有工作。

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

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

关于我的申请的信息:

  1. 它是多线程应用程序,每秒处理大约 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 时,是否会发生上下文切换?因为,按照上面的说法,这似乎没有性能影响。

最佳答案

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

  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 上下文切换加倍,这是 Tom Kyte 文章和我个人经验所概述的更昂贵的切换。

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

  3. 没有3.问题

  4. PLSQL 引擎中的 PLSQL 到 SQL 可以忽略不计,所以不要挂断它。将所有 SQL 调用放在 1 个 PLSQL 调用中以获得最大性能吞吐量。不要仅仅为了更 Eloquent 而牺牲性能而拆分调用。

关于c++ - 从应用程序多次调用数据库过程是否会影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34762829/

相关文章:

c++ - 如何从ffmpeg获取文件描述符

c# - Monitor.PulseAll() 中需要帮助

java - 当线程池中没有空闲线程并且我们向池中提交任务时会发生什么?

sql - Oracle 到 Derby - ConnectBy 并从 Derby 中的等效项开始

json - PL/SQL 中的 APEX_JSON.get_varchar2

c++ - 未解析的外部符号“public :

c++ - C 库 - 在 C++ 中使用 : redefinition, 不同的类型修饰符

c++ - 调试从托管应用程序调用的 C++ 代码时看不到变量内容

python - pymongo 无法使用多线程

performance - 有没有办法限制或限制 Oracle 中用户使用的资源?