国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

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

2019-11-18 12:04:32
字體:
供稿:網(wǎng)友

  對于訪問量高的系統(tǒng),每次創(chuàng)建一個連接都會消耗一定的資源,我們可以事先創(chuàng)建好一定數(shù)量的連接放入連接池中提供給用戶使用,用戶使用完后把連接返回連接池,這里我就來說說連接池的治理。
  
  首先,讓我們來看看連接池的概念:
  1。連接池答應(yīng)應(yīng)用程序從連接池中獲得一個連接并使用這個連接,而不需要為每一個連接請求重新建立一個連接。一旦一個新的連接被創(chuàng)建并且放置在連接池中,應(yīng)用程序就可以重復(fù)使用這個連接而不必實施整個數(shù)據(jù)庫連接創(chuàng)建過程。
  2。當(dāng)應(yīng)用程序請求一個連接時,連接池為該應(yīng)用程序分配一個連接而不是重新建立一個連接;當(dāng)應(yīng)用程序使用完連接后,該連接被歸還給連接池而不是直接釋放。
  
  優(yōu)點:
  1。使用連接池的最主要的優(yōu)點是性能。
  2。創(chuàng)建一個新的數(shù)據(jù)庫連接所耗費的時間主要取決于網(wǎng)絡(luò)的速度以及應(yīng)用程序和數(shù)據(jù)庫服務(wù)器的(網(wǎng)絡(luò))距離,而且這個過程通常是一個很耗時的過程。而采用數(shù)據(jù)庫連接池后,數(shù)據(jù)庫連接請求可以直接通過連接池滿足而不需要為該請求重新連接、認(rèn)證到數(shù)據(jù)庫服務(wù)器,這樣就節(jié)省了時間。
  
  缺點:
  1。數(shù)據(jù)庫連接池中可能存在著多個沒有被使用的連接一直連接著數(shù)據(jù)庫(這意味著資源的浪費)。
  ps:這必須要求開發(fā)人員在開發(fā)時估計這個系統(tǒng)最大提供的數(shù)量是多少。
  
  池的創(chuàng)建和分配
  當(dāng)連接打開時,將根據(jù)一種精確的匹配算法來創(chuàng)建連接池,該算法會使連接池與連接中的字符串相關(guān)聯(lián)。每個連接池都與一個不同的連接字符串相關(guān)聯(lián)。當(dāng)新連接打開時,假如連接字符串不精確匹配現(xiàn)有池,則將創(chuàng)建一個新池。
  
  在以下示例中,將創(chuàng)建三個新的 SqlConnection 對象,但只需要使用兩個連接池來治理這些對象。請注重,第一個和第二個連接字符串的差異在于為 Initial Catalog 分配的值。
  
  SqlConnection conn = new SqlConnection();
  conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
  conn.Open();
  // 連接池A創(chuàng)建了
  
  SqlConnection conn = new SqlConnection();
  conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
  conn.Open();
  // 連接池B創(chuàng)建了,因為ConnectionString與A不匹配
  
  SqlConnection conn = new SqlConnection();
  conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
  conn.Open();
  // 使用A的連接池,因為ConnectionString與A匹配
  
  連接池一旦創(chuàng)建,直到活動進(jìn)程終止時才會被毀壞。非活動或空池的維護(hù)只需要最少的系統(tǒng)開銷。
  
  連接的添加
  連接池是為每個唯一的連接字符串創(chuàng)建的。當(dāng)創(chuàng)建一個池后,將創(chuàng)建多個連接對象并將其添加到該池中,以滿足最小池大小的要求。連接將根據(jù)需要添加到池中,直至達(dá)到最大池大小。
  
  當(dāng)請求 SqlConnection 對象時,假如存在可用的連接,則將從池中獲取該對象。若要成為可用連接,該連接當(dāng)前必須未被使用,具有匹配的事務(wù)上下文或者不與任何事務(wù)上下文相關(guān)聯(lián),并且具有與服務(wù)器的有效鏈接。
  
  假如已達(dá)到最大池大小且不存在可用的連接,則該請求將會排隊。當(dāng)連接被釋放回池中時,連接池治理程序通過重新分配連接來滿足這些請求。對 Connection 調(diào)用 Close 或 Dispose 時,連接被釋放回池中。
  
  警告  建議使用完 Connection 后始終將其關(guān)閉,以便連接可以返回到池中。這可以使用 Connection 對象的 Close 或 Dispose 方法來實現(xiàn)。不是顯式關(guān)閉的連接可能不會添加或返回到池中。例如,假如連接已超出范圍但沒有顯式關(guān)閉,則僅當(dāng)達(dá)到最大池大小而該連接仍然有效時,該連接才會返回到連接池中。
  注重  不要在類的 Finalize 方法中對 Connection、DataReader 或任何其他托管對象調(diào)用 Close 或 Dispose。在終結(jié)器中,僅釋放類直接擁有的非托管資源。假如類不擁有任何非托管資源,則不要在類定義中包含 Finalize 方法。有關(guān)更多信息,請參見垃圾回收編程。
  
  連接的移除
  假如連接生存期已過期,或者連接池治理程序檢測到與服務(wù)器的連接已斷開,連接池治理程序?qū)某刂幸瞥撨B接。請注重,只有在嘗試與服務(wù)器進(jìn)行通信后,才可以檢測到這種情況。假如發(fā)現(xiàn)某連接不再連接到服務(wù)器,則會將其標(biāo)記為無效。連接池治理程序會定期掃描連接池,查找已釋放到池中并標(biāo)記為無效的對象。找到后,這些連接將被永久移除。
  
  假如存在與已消失的服務(wù)器的連接,那么即使連接池治理程序未檢測到已斷開的連接并將其標(biāo)記為無效,仍有可能將此連接從池中取出。當(dāng)發(fā)生這種情況時,將生成異常。但是,為了將該連接釋放回池中,仍必須將其關(guān)閉。
  
  字符串要害字:
  Connection Lifetime 0 當(dāng)連接返回到池中時,將對它的創(chuàng)建時間和當(dāng)前時間進(jìn)行比較,假如時間間隔超過由 Connection Lifetime 指定的值(以秒為單位),則會毀壞該連接。在聚集配置中可以使用它來強制在運行服務(wù)器和剛聯(lián)機(jī)的服務(wù)器之間達(dá)到負(fù)載平衡。
  假如值為零 (0),則將使池連接具有最大的超時期限。
  
  Connection Reset 'true' 確定在從池中移除數(shù)據(jù)庫連接時是否將其重置。對于 Microsoft SQL Server 版本 7.0,假如設(shè)置為 false,將避免在獲取連接時經(jīng)歷一個額外的往返過程,但必須注重的是連接狀態(tài)(如數(shù)據(jù)庫上下文)不會被重置。
  Enlist 'true' 當(dāng)為 true 時,假如存在事務(wù)上下文,池治理程序?qū)⒆詣釉趧?chuàng)建線程的當(dāng)前事務(wù)上下文中登記連接。
  Max Pool Size 100 池中答應(yīng)的最大連接數(shù)。
  Min Pool Size 0 池中維護(hù)的最小連接數(shù)。
  Pooling 'true' 當(dāng)為 true 時,將從相應(yīng)的池中取出連接,或者在必要時創(chuàng)建連接并將其添加到相應(yīng)的池中。
  
  實例代碼:
  namespace HowTo.Samples.ADONET
  {
  
  using System;
  using System.Data.SqlClient;
  
  public class connectionpooling
  {
  public static void Main()
  {
  connectionpooling myconnectionpooling = new connectionpooling();
  myconnectionpooling.Run();
  }
  
  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: 5
  // Enlist:       true
  // Min Pool Size:    1
  // Max Pool Size:    50
  connString = "server=(local)//NetSDK;Trusted_Connection=yes;database=northwind;" +
  "connection reset=false;" +
  "connection lifetime=5;" +
  "min pool size=1;" +
  "max pool size=50";
  
  SqlConnection myConnection1 = new SqlConnection(connString);
  SqlConnection myConnection2 = new SqlConnection(connString);
  SqlConnection myConnection3 = new SqlConnection(connString);
  
  // Open two connections.
  Console.WriteLine ("打開兩個連接。");
  myConnection1.Open();
  myConnection2.Open();
  
  // Now there are two connections in the pool that matches the connection string.
  // Return the both connections to the pool.
  Console.WriteLine ("將兩個連接都返回到池中。");
  myConnection1.Close();
  myConnection2.Close();
  
  // Get a connection out of the pool.
  Console.WriteLine ("從池中打開一個連接。");
  myConnection1.Open();
  
  // Get a second connection out of the pool.
  Console.WriteLine ("從池中打開第二個連接。");
  myConnection2.Open();
  
  // Open a third connection.
  Console.WriteLine ("打開第三個連接。");
  myConnection3.Open();
  
  // Return the all connections to the pool.
  Console.WriteLine ("將所有三個連接都返回到池中。");
  myConnection1.Close();
  myConnection2.Close();
  myConnection3.Close();
  }
  catch (Exception e)
  {
  // Display the error.
  Console.WriteLine(e.ToString());
  }
  }
  }
  
  }

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁远县| 玉溪市| 额尔古纳市| 麟游县| 绥宁县| 荥经县| 中方县| 莫力| 泽州县| 宁明县| 霍林郭勒市| 呈贡县| 堆龙德庆县| 临沂市| 丹江口市| 堆龙德庆县| 喀什市| 自治县| 湖北省| 连平县| 利津县| 安图县| 广饶县| 邹城市| 叶城县| 枣强县| 定远县| 沅江市| 札达县| 阿图什市| 静安区| 肇州县| 花莲县| 富蕴县| 吉隆县| 梁山县| 胶州市| 重庆市| 美姑县| 石林| 互助|