在我的项目中,我们使用oracle提供的Pro *C/C++库从我们的c++应用程序中调用oracle过程。
我们有一个大的过程,我的想法是为了模块化,把这个过程分成两个。但是他们的建议是一次性调用这个程序,并一次完成所有的工作。
我从他们那里得到的原因是它会影响性能,因为应用程序与数据库进行了多次交互。
我同意,当应用程序连接数据库、调用过程并最终断开每个过程调用的数据库时,就会发生上述情况。但是,我们真正要做的是在启动时创建一个连接池,并重用这些预连接的数据库连接来与数据库进行交互。
关于我的应用程序的信息:
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上下文切换会发生吗?因为,根据上面的说法,它似乎没有性能影响。
发布于 2016-01-14 02:47:57
您的建议是正确的,最好一次执行所有数据库任务。在您的场景中有两个主要的性能影响。
话虽如此,您正在应用程序结束时创建一个连接池,TNS侦听器还应该有一个遗留的服务器影子进程池等待每个网络连接(这是在listener.ora上设置的)。
当影子进程已经在等待连接时,OCI登录/注销非常快速,并且不会成为延迟的一个巨大因素--我不担心这一点,除非服务器上的一个新的影子进程必须启动--那么它可能是一个非常昂贵的调用。当您在客户端使用连接池时,这通常不是一个问题,而是一些需要考虑的问题,因为您的调用中存在线程。一旦耗尽了服务器阴影进程池,如果TNS侦听器必须启动更多的服务器阴影进程,您将注意到一个巨大的退化。
编辑:回答新问题:
https://stackoverflow.com/questions/34762829
复制相似问题