2012-01-25 61 views
2

我有一個簡單的C#代碼,我試圖打開和關閉連接多次。我怎樣才能確保我的新連接來自連接池並且不會觸及數據庫?C#如何「驗證」,新連接實際上從連接池中重用

using System; 
using System.Data; 
using System.Data.Odbc; 
using System.Collections.Generic; 

namespace LBSService 
{ 
    class MyClass { 
     public static OdbcConnection connection = null;  
     public void TestConnection() 
     { 
      string connectionstring = @"Dsn=my_database.IServer;Host=IServer; 
             Database=my_database;Uid=informix; 
             [email protected]"; 

      for (int i = 1; i <= 50; i++) 
      { 
       string StrQuery = "select * from capture_files"; 
       connection = new OdbcConnection(connectionstring); 
       connection.Open(); 
       connection.Close(); 
      } 
     } 
    } 
} 

我有限制,我必須打開一個ODBC連接,所以與ODBC有關的回答是首選。

我的「連接」對象中是否有任何數據記憶體,或者我可以實際查看池中有多少未使用的連接,以及我的應用程序使用了多少個連接。

在此先感謝...

回答

0

你可能在你的函數中使用的時序與添加和移除連接字符串這樣的:

Pooling=false; 

如果時序變化 - 那麼沒有這個字符串連接重用

像這樣:

public long TestConnection(bool usepooling) 
{ 
    string connectionstring = @"Dsn=my_database.IServer;Host=IServer; 
            Database=my_database;Uid=informix; 
            [email protected];Pooling="+usepooling.ToString; 


    Stopwatch sw = new Stopwatch(); 
    for (int i = 1; i <= 50; i++) 
    { 
    string StrQuery = "select * from capture_files"; 
    connection = new OdbcConnection(connectionstring); 
    sw.Start(); 
    connection.Open(); 
    connection.Close(); 
    sw.Stop(); 
    } 

    return sw.ElapsedMilliseconds; 

} 
3

「我怎樣才能確保我的新連接將從連接池 到來,它沒有命中數據庫」

也就是說稍有錯誤的邏輯。連接池位於客戶端。即使您從池中重新使用連接,任何命令仍然必須擊中數據庫。

如果你有正是相同的連接字符串(低至情況偶數),那麼你會重用池中的連接(只要它被打開,這是默認的)。

連接池存在的原因是因爲建立連接需要一些開銷。

SQL Server Connection Pooling

連接到數據庫服務器通常由幾個 耗時的步驟。必須建立物理通道(如套接字或名爲 管道),與服務器的初始握手必須發生 ,必須解析連接字符串信息,連接必須由服務器進行身份驗證,檢查必須運行 參與當前的交易,等等。

實際上,大多數應用程序僅使用一個或幾個不同的 配置進行連接。這意味着在執行應用程序 時,許多相同的連接將被重複打開並關閉 。爲了最小化開放連接的成本,ADO.NET使用稱爲連接池的優化技術 。

連接池減少了必須打開新連接 的次數。共同池持有物理連接的所有權。它通過爲每個給定的連接配置保持一組活動的 連接來管理連接。只要用戶 在連接上調用Open,池就會在池中查找可用的 連接。如果有一個池連接可用,它將 返回給調用者,而不是打開一個新的連接。當 應用程序在連接上調用Close時,池會將其返回到 活動連接的池集,而不是關閉它。一旦 連接返回到池中,它就準備好在 下一次打開呼叫時重新使用。

只能彙集具有相同配置的連接。 ADO.NET 同時保留多個池,每個配置一個池。 通過連接字符串將連接分爲多個池,並通過 使用集成安全性時的Windows身份。連接數 也根據他們是否參與交易進行彙集。