Oracle ODP.NET鏈接池

數據庫鏈接池

鏈接池是數據庫鏈接的緩存,每當應用程序須要鏈接數據庫時向鏈接池申請數據庫鏈接,鏈接池負責具體數據庫鏈接的建立和銷燬。鏈接池中的數據庫鏈接會緩存一段時間,後續的鏈接請求首先使用緩存中的數據庫鏈接,若是緩存中有空閒的鏈接則直接使用,無空閒鏈接時就去新建立。這樣能夠提升因數據庫鏈接建立而額外消耗的資源,從而提升總體性能。sql

.NET鏈接Oracle

.NET鏈接Oracle數據庫的庫主要有3種:數據庫

  1. .NET自帶的 .NET Framework Data Provider for Oracle
  2. Devart提供的dotConnect for Oracle
  3. Oracle提供的 Oracle Data Provider for .NET / ODP.NET

 

目前xAsset系統使用的是第3種,由Oracle提供的ODP.NET。ODP.NET提供了一套實現了ADO.NET相關接口的類,並提供了使用Oracle數據庫一些高級功能的接口,好比RAC,XML DB,批量插入等。相對於.NET自帶的庫性能上也提升很多。緩存

ODP.NET如今是Oracle ODAC(Oracle Data Access Component)的一部分。使用前須要先安裝ODAC組件,Oracle提供了xcopy的方式和可執行程序的方式供下載安裝。具體安裝方法見官方文檔。服務器

ODP.NET的數據庫鏈接字符串格式主要有如下幾種:ide

  1. 使用TNS

該方式須要配置TNS,通常須要提供用戶id和密碼(集成認證方式能夠省略用戶id和密碼)。具體的字符串格式以下:性能

Data Source=TORCL;User Id=myUsername;Password=myPassword;server

 

  1. 不依賴tnsnames.ora的ODP.NET方式

該方式不須要配置TNS,以把配置在TNS裏的鏈接字符串直接放到Data Source節點中的方式實現。鏈接字符串中直接提供了服務器地址,端口,實例等信息,具體格式以下:接口

Data Source=(DESCRIPTION=(ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=MyHost) (PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));生命週期

User Id=myUsername;Password=myPassword;資源

 

  1. 使用EZ Connect的方式

使用EZ Connect方式也不須要進行特殊配置,但須要數據庫服務中的sqlnet.ora啓用該方式,添加NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)啓用,具體鏈接字符串格式以下:

Data Source=username/password@myserver//instancename;

ODP.NET的鏈接池及相關功能

ODP.NET提供了鏈接池的功能。固然咱們能夠選擇使用或不使用,是否啓用鏈接池功能由數據庫鏈接字符串決定。鏈接參數提供了Pooling這個參數,若是值爲true則啓用鏈接池,不然不啓用,不提供該參數時默認是啓用鏈接池的。

數據庫鏈接參數中除了上面提到的標準參數Data Source,User Id,Password外,與鏈接池相關的參數主要有幾個:Connection Lifetime, Connection Timeout, Decr Pool Size, Incr Pool Size, Max Pool Size, Min Pool Size, Pooling, Validate Connection。

當啓用鏈接池時,取得一個數據庫鏈接的過程大體以下:

l  若是鏈接池不存在(好比應用程序剛啓動第一次訪問數據庫),則ODP.NET建立鏈接池並按參數「Min Pool Size」設置的值(默認1)初始化數據庫鏈接。這個值指定了鏈接池中的最小鏈接數量,不管如何鏈接池中至少有該值設定的數據庫鏈接存在。直到鏈接池銷燬。

l  若是鏈接池存在,則檢查是否有可用鏈接。

u  若是有可用鏈接,鏈接就從池中取出返回給應用程序。

n  若是啓用了「Validate Connection」,則鏈接池會去數據庫服務器驗證固然鏈接是否有效。

u  若是沒有可用鏈接,鏈接池會檢查當前池中的鏈接數是否已達到指定的上限「Max Pool Size」(默認100)。

n  若是已經達到最大上限,則請求會等待一段「Connection Timeout」(默認15秒)指定的時間,檢查是否這段時間內有鏈接返回到池中。

  • 若是有鏈接返回到池中,則直接取該鏈接返回給請求的應用程序。
  • 若是指定時間內仍沒有鏈接可用,則拋出「Connection request timed out」異常。

n  若是還沒達到上限,則鏈接池會主動建立「Incr Pool Size」(默認5)指定的值的鏈接,並返回其中一個給請求的應用程序。

當應用程序從數據庫取得數據並調用Close()/Dispose()時,鏈接池檢查鏈接的生命同期是否超過了「Connection Lifetime」(默認0,不檢查)。

若是鏈接的生命週期超過了定義的值,則該鏈接會被真正關閉。這個關閉,指應用程序所在鏈接池到數據庫服務器的物理鏈接關閉。

鏈接只有返回到池中時纔會作該檢查,若是在使用中不會檢查。

固然若是鏈接真正關閉後池中的鏈接數量會小於「Min Pool Size」指定的值時,鏈接也不會關閉。

鏈接池每隔3分鐘會關閉池中沒有使用的鏈接,每次關閉的數量由「Decr Pool Size」設定的值(默認1)指定。

相關文章
相關標籤/搜索