2013-04-12 41 views
5

我正在嘗試使用ODP.NET版本2.111.6.20爲我的.NET應用程序配置連接池。數據庫是Oracle 11.1。ODP.NET連接池參數

我用我的.NET 2.0的應用程序下面的連接字符串:

Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=2; Max Pool Size=5; Connection Timeout=30;"

根據文檔的連接池應該有2個連接和初始化,並根據需要增加多達5個連接。它永遠不會超過5個連接。

我所看到的是連接正在增長,一次增長到10個連接。我通過查詢v $ session表來監視Oracle數據庫中的連接,所以我知道連接來自於源自我的應用程序的特定應用程序。

如果任何人都可以幫助我確定此應用程序中的連接池中可能發生了什麼,可能會允許超過最大連接數,我將不勝感激。

樣品C#代碼

這裏是使數據庫的調用的代碼示例:

const string connectionString = "Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=5; Max Pool Size=5; Connection Timeout=30;"; 

using (OracleConnection connection = new OracleConnection(connectionString)) { 
    connection.Open(); 

    using (OracleCommand command = new OracleCommand("ALTER SESSION SET TIME_ZONE='UTC'", connection)) { 
     command.ExecuteScalar(); 
    } 

    using (OracleTransaction transaction = connection.BeginTransaction()) { 
     const string procSql = @"BEGIN P_SERVICES.UPDATE_VERSION(:id, :version, :installDate); END;"; 
     using (OracleCommand command = new OracleCommand(procSql, connection)) { 
      command.Parameters.Add(new OracleParameter("id", OracleDbType.Varchar2) { Value = id }); 
      command.Parameters.Add(new OracleParameter("version", OracleDbType.Varchar2) { Value = version }); 
      command.Parameters.Add(new OracleParameter("installDate", OracleDbType.TimeStamp) { Value = dateUpdated }); 

      try { 
       command.ExecuteNonQuery(); 
      } catch (OracleException oe) { 
       if (Log.IsErrorEnabled) { 
        Log.ErrorFormat("Update Error: {0}", oe.Message); 
       } 

       throw; 
      } 

      transaction.Commit(); 
     } 
    } 
} 
+0

你可以發表你如何執行你的命令的例子嗎?很高興看到您使用的是「USING」還是手動創建/處理您的連接/命令 –

+0

請參閱代碼示例原始文章的更新...如您所見,我已在使用語句代碼而不是手動關閉處理連接 – jprincipe

+0

My Oracle.DataAccess程序集是4.112.3.0,是否您的程序集版本爲2.111.6.20?如果是這樣,也許是時候更新了。除非你被限制在.NET 4以前版本,並且不能? –

回答

10

我已經找到了原因,在數據庫中看到的最大連接數不斷增加過去允許在連接池設置的數量在連接字符串中。

應用程序池在IIS中配置爲具有設定得比1.默認不同的「工作進程的最大數量」我發現的是,在數據庫中看到連接的數量可以增長到Max Pool Size * Number of Worker Processes

所以,如果我有最大池5和5 工人的尺寸流程然後連接允許總數25如此看來,每個工作進程都有它的一個連接池的自己的實例不共享跨越其他工作流程。

+2

此外,請注意,連接池是每個應用程序域的每個工作進程,因此,最大池大小爲5 * 5工作進程* 2個域中的每個= 50個連接。 – RolandoCC

3

根據Tom kyte:
連接是你和數據庫之間的物理電路。
連接可能是 許多類型之一 - 最流行的開始DEDICATED服務器和SHARED服務器。
可以通過與數據庫的給定連接建立零個,一個或多個會話
會話將使用一個進程執行語句。
有時 CONNECTION-> SESSION-> PROCESS(例如:正常的 專用服務器連接)之間存在一對一關係。
有時會有連接到 會話的一對多。
然而, 不必專用於特定的連接或會話,例如,當 使用共享服務器(MTS)時,SESSION將從 的進程池中獲取進程以執行語句。當通話結束時,該過程被釋放回 過程池。
所以運行
select username from v$session where username is not null 會顯示當前seesions(未連接)
要查看的連接,你可以使用

select username, program from v$process; 

約JDBC有用的書和會話VS連接可以發現here

3

你可以使用此查詢來監視您的連接數&狀態。使用這個查詢,我能夠確認連接字符串設置正在工作,下面的解釋。

select COUNT(*) AS Connections 
     ,s.username 
     ,s.status 
     ,s.module 
     ,s.osuser 
from V$process p 
join V$session s on s.paddr = p.addr 
where NOT s.UserName IS NULL 
group by s.username 
     ,s.status 
     ,s.module 
     ,s.osuser 

我跑了這2頁做了一堆數據庫檢索。這裏是我不同的結果:

最大池大小= 5

Max Pool Size = 5

我看到了相同的用戶名作爲Web服務器的空模塊下的計數波動。我不知道他們爲什麼出現在這個桶以及網絡服務器之下。

最大池大小= 1

Max Pool Size = 1

當我制約了池的大小,我只看到了空模塊1個連接,併爲網絡服務器1個連接,但後來連接彈出在DBMS_SCHEDULER下,這表明其餘的retreivals都在等待處理?

我認爲這證明最大池大小正在工作,但我不確定。

+0

感謝您提供有關v $進程的信息。不幸的是,這只是給了我在v $ session表中找到的相同數字的細目。我看到現在已經建立了20個連接,但已經達到了25個。v $ process表中的當前故障是來自連接用戶的14個連接,其狀態爲INACTIVE,w3wp.exe模塊和osuser網絡?服務。該用戶還有另外6個與NETWORK?SERVICE的OSUSER處於非活動狀態的連接,但是有一個(空)模塊。 – jprincipe

+0

您是否從DBMS_SCHEDULER看到任何內容?你能發佈你的結果的蒙版版本嗎? –

+0

對於有問題的數據庫用戶,我沒有看到與DBMS_SCHEDULER相關的任何內容。所有連接都來自w3wp.exe或(null)。 – jprincipe

2

如果你絕對必須解決這個問題,並且願意用性能計數器弄髒&,這篇博文可能會有所幫助。至少它可能有助於縮小Oracle報告的連接數量與.NET聲稱擁有的非共用連接數量之間的差異。

http://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out/

這些計數器看起來他們會特別有用:

NumberOfActiveConnectionPools 
NumberOfActiveConnections 
NumberOfFreeConnections 
NumberOfInactiveConnectionPools 
NumberOfNonPooledConnections 
NumberOfPooledConnections 
NumberOfReclaimedConnections 
NumberOfStasisConnections