2016-01-13 109 views
1

在我的項目中,我們正在從我們的C++應用程序調用oracle程序, 由oracle提供的Pro * C/C++庫的幫助。當應用程序多次調用數據庫過程時,性能是否會受到影響?

我們有一個大的程序,我的想法是將程序拆分爲兩個模塊。但是他們的建議是一次調用這個程序,並且一次執行所有的工作。

我從他們那裏得到的原因是它會引起性能影響,因爲應用程序與數據庫多次交互。

我同意,當應用程序連接數據庫,調用過程並最終斷開每個過程調用的數據庫時,上述情況就會發生。但是,我們真正做的是在啓動時創建連接池,並重新使用預連接的數據庫連接與數據庫進行交互。

我的應用程序:

  1. 這是multi-threaded application,它可以處理大約每秒1000請求與線程池的大小爲20,目前爲每一個請求,我們與數據庫進行通信的4倍。

編輯:

「PLSQL和SQL之間的切換是不是周圍的其他方法快得多」。 Q1。這是如何與我的實際問題有關?我的問題是關於將程序分成兩個相等的部分。假設我有4個查詢在程序中執行,我只是將它分成兩個程序a和程序b,每個程序都有兩個查詢。

「調用PLSQL的pro * c調用性能受到影響」。 Q2。你是指應用程序(pro * C/C++)和數據庫(oracle)之間的通信嗎?如果是這樣,溝通是一個很大的表現?

在你連接的問題tom鏈接中,「但是不要害怕從PLSQL調用SQL - 這是PLSQL最好的」 Q4。在我們從PLSQL中調用SQL的時候,Wheather context switch會發生什麼?因爲按照上述說法,這似乎沒有影響。

+1

您是否測量了它,看看真實世界的影響是什麼? –

回答

1

您的建議是正確的,一次執行所有數據庫任務會更好。在您的場景中有兩個主要的性能影響

  1. 在SQL引擎和PL/SQL引擎之間切換pro * c的上下文以多次運行您的線程。通常來自客戶端應用程序的許多PL/SQL調用中的最大問題。
  2. 您的pro * c應用程序和數據庫引擎之間的通信中的網絡堆棧開銷(TNS) - 特別是如果您的應用程序位於不同的物理主機上。

話雖如此,你正在應用程序端創建一個連接池,TNS監聽器還應該有一個等待每個網絡連接(這是在listener.ora中設置)的遺留服務器陰影進程池。

當影子進程已經在等待連接時,OCI登錄/註銷非常快,並且不是延遲的一個重要因素 - 我不擔心這種情況,除非服務器上的新影子進程必須啓動 - 然後它可能是一個非常昂貴的電話。當你在客戶端使用連接池時,這通常不是問題,而只是由於線程在你的調用中需要考慮的問題。一旦你耗盡了服務器影子進程池,如果TNS監聽器必須啓動更多的服務器影子進程,你會發現一個巨大的降級。

編輯在回答新問題:

  1. 這是非常相關的。如前所述,您應該儘量減少C++應用程序中的plsql和sql調用的數量。在C++應用程序調用中的每個PLSQL調用都會調用SQL引擎,然後調用PLSQL引擎進行過程調用。所以,如果你將你的過程分成兩部分 - 你將SQL翻倍到PLSQL上下文切換,這是Tom Kyte文章和我自己的個人經驗概述的更加昂貴的切換。

  2. 在1中回答。但正如我之前所說的,除非您的主機位於不同的物理網絡和您正在傳輸的數據類型,否則通信開銷是第二。例如,大量的C++對象參數和帶有很多調用的大Oracle結果集顯然會影響往返的通信延遲。請記住,通過更多的PLSQL調用,您還可以爲每個連接和結果集的設置添加更多的SQLNET流量。

  3. 沒有3問題

  4. PLSQL到SQL中的PLSQL引擎是可以忽略不計,所以不要得到掛掉電話就可以了。將所有的SQL調用放在1個PLSQL調用中,以獲得最大的性能吞吐量。不要將這些電話分開,只是爲了更加雄辯地表現昂貴的表現。

+1

我明白了,plsql引擎是不同的,而且sql引擎是不同的。由於兩個引擎不同,所以上下文切換需要時間。考慮我將我的程序分成兩個相等的部分。根據我的不確定的上下文切換將發生在過程中的每個sql查詢。 因此,即使我們拆分過程,上下文切換也會發生相同的次數。我的理解是否正確? –

+0

你幾乎是正確的 - PLSQL和SQL之間的切換比其他方式快得多。所以在你的1或2個PLSQL調用中有幾個SQL調用,我不會太擔心。然而,有很多調用SQL的pro * c調用,然後是PLSQL例程等等 - 我多次看到這是一個很大的性能問題。更多信息在這裏:https://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:60122715103602 –

+0

請在問題中找到編輯並回復 –

相關問題