2013-12-11 94 views
0

使用Oracle的ODP.NET庫,我正在處理的應用程序需要執行兩種不同類型的查詢,其中一種類型可能相對較慢,但另一種類型的查詢速度要快。我繼承的當前應用程序代碼完全禁用連接池,併爲「快速」查詢保留特定的連接對象,這對於此目的非常有用,因爲如果第一次調用的時間超過X毫秒,我們就可以切換到另一個打開的連接,提醒用戶如果第二次通話不夠快,數據沒有足夠快地返回。單個連接的ODP.NET連接池關閉?

與此同時,更改連接字符串以啓用池化操作後,我們運行的常規查詢返回的速度要快得多,因此使用池化查詢會更好。

有沒有一種方法可以爲大多數目的啓用池,但禁用它的特定連接對象?或者它會更容易一些(因爲我們已經有了基本的代碼來爲關鍵查詢「彙集」兩個連接)來擴展現有的代碼,以通過一般查詢的連接對象的小集合進行輪換,並保持兩個其他連接分開對於更關鍵的查詢?

+0

我認爲你並不是想通過煙霧來取代火焰。在連接對象之間切換會導致代碼難以理解,並且該解決方案會增加代碼的複雜性(維護這些連接)。在一個項目中,我們發現計算執行計劃花了很長時間,我們認爲應該將這些執行計劃存儲到數據庫中,幾周後我們意識到左外連接是慢查詢和消除這些問題的真正原因。 – Mino

+0

現有的代碼在任務內部運行查詢,因此使用不同的連接運行另一個任務很容易通過簡短的'//過了很長時間,再次嘗試不同的連接'來解釋。就實際查詢而言,我無法以任何方式對其進行優化,幸運的是,它通常返回的速度比我們的閾值快大約10倍。如果沒有,我們使用新連接從羣集中獲取響應相同TNS名稱的空閒服務器(根據DBA強大的「建議」),這通常可以解決問題。 – Amazingant

+0

您是否檢查過此網站? http://www.oracle.com/technetwork/issue-archive/2006/06-jul/o46odp-097508。html – Mino

回答

1

在鏈接到here文章@Mino,它指出:

如果在連接字符串參數中的任何一個被修改,ODP.NET將創建一個新的連接池爲您的應用程序下一次連接請求。

擴展和基於從Visual Studio的調試器和拆卸工具JustDecompile信息澄清聲明,我相信:

  • 目前ODP.NET連接器創建一個新的連接池的任何時間連接字符串中的任何內容都會發生變化,甚至延伸到在字符串的不重要部分添加或刪除空白字符
  • 即使在該服務器的存在池的情況下,也可以在不使用連接緩衝池的情況下創建關閉緩衝池的任何連接。
  • 而且,使用已有連接池的連接字符串打開的任何新連接都將繼續使用舊池。

Oracle的連接池真的足夠聰明,可以做我想做的事。所有這些都使用Oracle.ManagedDataAccess.dll v4.121.1.0作爲Oracle.com的ODAC 12.1.0.1.0 with Oracle Developer Tools for Visual Studio包的一部分進行了調查。