熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

.NET程序中對連接池的管理方法

2013-11-23 18:54:38  來源: Java核心技術 

  對於訪問量高的系統每次創建一個連接都會消耗一定的資源我們可以事先創建好一定數量的連接放入連接池中提供給用戶使用用戶使用完後把連接返回連接池這裡我就來說說連接池的管理
  
  首先讓我們來看看連接池的概念
  連接池允許應用程序從連接池中獲得一個連接並使用這個連接而不需要為每一個連接請求重新建立一個連接一旦一個新的連接被創建並且放置在連接池中應用程序就可以重復使用這個連接而不必實施整個數據庫連接創建過程
  當應用程序請求一個連接時連接池為該應用程序分配一個連接而不是重新建立一個連接當應用程序使用完連接後該連接被歸還給連接池而不是直接釋放
  
  優點
  使用連接池的最主要的優點是性能
  創建一個新的數據庫連接所耗費的時間主要取決於網絡的速度以及應用程序和數據庫服務器的(網絡)距離而且這個過程通常是一個很耗時的過程而采用數據庫連接池後數據庫連接請求可以直接通過連接池滿足而不需要為該請求重新連接認證到數據庫服務器這樣就節省了時間
  
  缺點
  數據庫連接池中可能存在著多個沒有被使用的連接一直連接著數據庫(這意味著資源的浪費)
  ps這必須要求開發人員在開發時估計這個系統最大提供的數量是多少
  
  池的創建和分配
  當連接打開時將根據一種精確的匹配算法來創建連接池該算法會使連接池與連接中的字符串相關聯每個連接池都與一個不同的連接字符串相關聯當新連接打開時如果連接字符串不精確匹配現有池則將創建一個新池
  
  在以下示例中將創建三個新的 SqlConnection 對象但只需要使用兩個連接池來管理這些對象請注意第一個和第二個連接字符串的差異在於為 Initial Catalog 分配的值
  
  SqlConnection conn = new SqlConnection();
  connConnectionString = Integrated Security=SSPI;Initial Catalog=northwind;
  connOpen();
  // 連接池A創建了
  
  SqlConnection conn = new SqlConnection();
  connConnectionString = Integrated Security=SSPI;Initial Catalog=pubs;
  connOpen();
  // 連接池B創建了因為ConnectionString與A不匹配
  
  SqlConnection conn = new SqlConnection();
  connConnectionString = Integrated Security=SSPI;Initial Catalog=northwind;
  connOpen();
  // 使用A的連接池因為ConnectionString與A匹配
  
  連接池一旦創建直到活動進程終止時才會被毀壞非活動或空池的維護只需要最少的系統開銷
  
  連接的添加
  連接池是為每個唯一的連接字符串創建的當創建一個池後將創建多個連接對象並將其添加到該池中以滿足最小池大小的要求連接將根據需要添加到池中直至達到最大池大小
  
  當請求 SqlConnection 對象時如果存在可用的連接則將從池中獲取該對象若要成為可用連接該連接當前必須未被使用具有匹配的事務上下文或者不與任何事務上下文相關聯並且具有與服務器的有效鏈接
  
  如果已達到最大池大小且不存在可用的連接則該請求將會排隊當連接被釋放回池中時連接池管理程序通過重新分配連接來滿足這些請求對 Connection 調用 Close 或 Dispose 時連接被釋放回池中
  
  警告  建議使用完 Connection 後始終將其關閉以便連接可以返回到池中這可以使用 Connection 對象的 Close 或 Dispose 方法來實現不是顯式關閉的連接可能不會添加或返回到池中例如如果連接已超出范圍但沒有顯式關閉則僅當達到最大池大小而該連接仍然有效時該連接才會返回到連接池中
  注意  不要在類的 Finalize 方法中對 ConnectionDataReader 或任何其他托管對象調用 Close 或 Dispose在終結器中僅釋放類直接擁有的非托管資源如果類不擁有任何非托管資源則不要在類定義中包含 Finalize 方法有關更多信息請參見垃圾回收編程
  
  連接的移除
  如果連接生存期已過期或者連接池管理程序檢測到與服務器的連接已斷開連接池管理程序將從池中移除該連接請注意只有在嘗試與服務器進行通信後才可以檢測到這種情況如果發現某連接不再連接到服務器則會將其標記為無效連接池管理程序會定期掃描連接池查找已釋放到池中並標記為無效的對象找到後這些連接將被永久移除
  
  如果存在與已消失的服務器的連接那麼即使連接池管理程序未檢測到已斷開的連接並將其標記為無效仍有可能將此連接從池中取出當發生這種情況時將生成異常但是為了將該連接釋放回池中仍必須將其關閉
  
  字符串關鍵字
  Connection Lifetime 當連接返回到池中時將對它的創建時間和當前時間進行比較如果時間間隔超過由 Connection Lifetime 指定的值(以秒為單位)則會毀壞該連接在聚集配置中可以使用它來強制在運行服務器和剛聯機的服務器之間達到負載平衡
  如果值為零 ()則將使池連接具有最大的超時期限
  
  Connection Reset true 確定在從池中移除數據庫連接時是否將其重置對於 Microsoft SQL Server 版本 如果設置為 false將避免在獲取連接時經歷一個額外的往返過程但必須注意的是連接狀態(如數據庫上下文)不會被重置
  Enlist true 當為 true 時如果存在事務上下文池管理程序將自動在創建線程的當前事務上下文中登記連接
  Max Pool Size 池中允許的最大連接數
  Min Pool Size 池中維護的最小連接數
  Pooling true 當為 true 時將從相應的池中取出連接或者在必要時創建連接並將其添加到相應的池中
  
  實例代碼
  namespace HowToSamplesADONET
  {
  
  using System;
  using SystemDataSqlClient;
  
  public class connectionpooling
  {
  public static void Main()
  {
  connectionpooling myconnectionpooling = new connectionpooling();
  myconnectionpoolingRun();
  }
  
  public void Run()
  {
  try
  {
  String connString;
  
  // Specification in the connection string:
  // Please note: Pooling is implicit you automatically get it unless you disable it
  //       Therefore true is the default for the pooling keyword (pooling=true)
  // Connection Reset:  False
  // Connection Lifetime:
  // Enlist:       true
  // Min Pool Size:   
  // Max Pool Size:   
  connString = server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind; +
  connection reset=false; +
  connection lifetime=; +
  min pool size=; +
  max pool size=;
  
  SqlConnection myConnection = new SqlConnection(connString);
  SqlConnection myConnection = new SqlConnection(connString);
  SqlConnection myConnection = new SqlConnection(connString);
  
  // Open two connections
  ConsoleWriteLine (打開兩個連接);
  myConnectionOpen();
  myConnectionOpen();
  
  // Now there are two connections in the pool that matches the connection string
  // Return the both connections to the pool
  ConsoleWriteLine (將兩個連接都返回到池中);
  myConnectionClose();
  myConnectionClose();
  
  // Get a connection out of the pool
  ConsoleWriteLine (從池中打開一個連接);
  myConnectionOpen();
  
  // Get a second connection out of the pool
  ConsoleWriteLine (從池中打開第二個連接);
  myConnectionOpen();
  
  // Open a third connection
  ConsoleWriteLine (打開第三個連接);
  myConnectionOpen();
  
  // Return the all connections to the pool
  ConsoleWriteLine (將所有三個連接都返回到池中);
  myConnectionClose();
  myConnectionClose();
  myConnectionClose();
  }
  catch (Exception e)
  {
  // Display the error
  ConsoleWriteLine(eToString());
  }
  }
  }
  
  }

From:http://tw.wingwit.com/Article/program/Java/hx/201311/25961.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.