SQL 資料庫 Connection Pool 連線池觀念釐清

栏目: 数据库 · 发布时间: 7年前

内容简介:程式對資料庫存取是非常頻繁的操作,平常只會使用而沒有去深入了解底層的實作方式,這次花了點時間真正搞懂了 Connection Pool 的機制。從上面的兩個例子發現前四個消耗的秒數特別多,可能是因為初始化連線時所耗的效能導致此結果。第一個例子後面六個連線會發現都在 0-1 ms 之間;第二個例子後面六個連線都耗費了 4-16 ms 不等,由此可判斷程式自動幫我使用了連線池來增進效能。如果連線字串加上

程式對資料庫存取是非常頻繁的操作,平常只會使用而沒有去深入了解底層的實作方式,這次花了點時間真正搞懂了 Connection Pool 的機制。

  •  正常開關
    static void Main(string[] args)
    {
        // 設定相關資料庫連線參數
        string connection = @"Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=SSPI;AttachDBFilename=D:\Workspace\[03]Test\localdbtest\LocalDbTest\LocalDb.mdf;";
     
        Enumerable.Range(1, 10).Select(x => Task.Run(() =>
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            
            SqlConnection sqlConnection = new SqlConnection();
            sqlConnection.ConnectionString = connection;
     
            // 開啟連線
            sqlConnection.Open();
     
            sqlConnection.Close();
            sqlConnection.Dispose();
            sqlConnection = null;
     
            sw.Stop();
            Console.WriteLine($"連線 {x} 共耗時 {sw.ElapsedMilliseconds} 毫秒");
        })).ToList();
     
        Console.ReadKey();
    }
    
    SQL 資料庫 Connection Pool 連線池觀念釐清
  • 只開不關
    static void Main(string[] args)
    {
        // 設定相關資料庫連線參數
        string connection = @"Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=SSPI;AttachDBFilename=D:\Workspace\[03]Test\localdbtest\LocalDbTest\LocalDb.mdf;";
     
        Enumerable.Range(1, 10).Select(x => Task.Run(() =>
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
     
            SqlConnection sqlConnection = new SqlConnection();
            sqlConnection.ConnectionString = connection;
     
            // 開啟連線
            sqlConnection.Open();
     
            sw.Stop();
            Console.WriteLine($"連線 {x} 共耗時 {sw.ElapsedMilliseconds} 毫秒");
        })).ToList();
     
        Console.ReadKey();
    }
    
    SQL 資料庫 Connection Pool 連線池觀念釐清

從上面的兩個例子發現前四個消耗的秒數特別多,可能是因為初始化連線時所耗的效能導致此結果。第一個例子後面六個連線會發現都在 0-1 ms 之間;第二個例子後面六個連線都耗費了 4-16 ms 不等,由此可判斷程式自動幫我使用了連線池來增進效能。

如果連線字串加上 Max Pool Size=5 (預設為 100) 則可以限制最多開啟五條連線,高負載的應用程式可以借由調整此參數增進效能。

  • 限制連線池大小
    static void Main(string[] args)
    {
        // 設定相關資料庫連線參數
        string connection = @"Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=SSPI;AttachDBFilename=D:\Workspace\[03]Test\localdbtest\LocalDbTest\LocalDb.mdf;Max Pool Size=5";
     
        Enumerable.Range(1, 10).Select(x => Task.Run(() =>
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
     
            SqlConnection sqlConnection = new SqlConnection();
            sqlConnection.ConnectionString = connection;
     
            // 開啟連線
            sqlConnection.Open();
     
            sw.Stop();
            Console.WriteLine($"連線 {x} 共耗時 {sw.ElapsedMilliseconds} 毫秒");
        })).ToList();
     
        Console.ReadKey();
    }
    
    SQL 資料庫 Connection Pool 連線池觀念釐清
  • 關閉連線池(每次連線都建立新的連線)
    static void Main(string[] args)
    {
        // 設定相關資料庫連線參數
        string connection = @"Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=SSPI;AttachDBFilename=D:\Workspace\[03]Test\localdbtest\LocalDbTest\LocalDb.mdf;Max Pool Size=5;Pooling=False;";
     
        Enumerable.Range(1, 10).Select(x => Task.Run(() =>
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
     
            SqlConnection sqlConnection = new SqlConnection();
            sqlConnection.ConnectionString = connection;
     
            // 開啟連線
            sqlConnection.Open();
     
            sw.Stop();
            Console.WriteLine($"連線 {x} 共耗時 {sw.ElapsedMilliseconds} 毫秒");
        })).ToList();
     
        Console.ReadKey();
    }
    
    SQL 資料庫 Connection Pool 連線池觀念釐清

上面兩個例子可以看出限制連線數的情況下只開啟不關閉,會發生連線無法重用導致達到上限無法建立新連線,可能有人會說那關閉連線池不就得了?

但不要忘了一台電腦擁有的端口是有限的(65535),若超出上限你的程式還是會大爆炸,所以切記在撰寫資料庫程式的時候一定要保持隨手關連線的好習慣。

如果想要清除所有連線的話可以使用 SqlConnection.ClearAllPools() 強制清除連線池中未使用的連線

static void Main(string[] args)
{
    // 設定相關資料庫連線參數
    string connection = @"Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=SSPI;AttachDBFilename=D:\Workspace\[03]Test\localdbtest\LocalDbTest\LocalDb.mdf;Max Pool Size=5;";
 
    Enumerable.Range(1, 10).Select(x => Task.Run(() =>
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
 
        SqlConnection sqlConnection = new SqlConnection();
        sqlConnection.ConnectionString = connection;
 
        // 開啟連線
        sqlConnection.Open();
 
        sqlConnection.Close();
        sqlConnection.Dispose();
        sqlConnection = null;
        SqlConnection.ClearAllPools();
 
        sw.Stop();
        Console.WriteLine($"連線 {x} 共耗時 {sw.ElapsedMilliseconds} 毫秒");
    })).ToList();
 
    Console.ReadKey();
}

SQL 資料庫 Connection Pool 連線池觀念釐清


以上所述就是小编给大家介绍的《SQL 資料庫 Connection Pool 連線池觀念釐清》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Numerical Methods and Methods of Approximation in Science and En

Numerical Methods and Methods of Approximation in Science and En

Karan Surana / CRC Press / 2018-10-31

ABOUT THIS BOOK Numerical Methods and Methods of Approximation in Science and Engineering prepares students and other readers for advanced studies involving applied numerical and computational anal......一起来看看 《Numerical Methods and Methods of Approximation in Science and En》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换