Rumah pangkalan data tutorial mysql SqlConnection 的连接池机制解析

SqlConnection 的连接池机制解析

Jun 07, 2016 pm 05:48 PM
kolam sambungan

提供一篇关于sqlconnection连接池详细,有需要的朋友参考一下。

物理连接建立时,需要做和服务器握手,解析连接字符串,授权,约束的检查等等操作,而物理连接建立后,这些操作就不会去做了。这些操作是需要一定的时间的。所以很多人喜欢用一个静态对象存储 SqlConnection 来始终保持物理连接,但采用静态对象时,多线程访问会带来一些问题,实际上,我们完全不需要这么做,因为 SqlConnection 默认打开了连接池功能,当程序 执行  SqlConnection.Close 后,物理连接并不会被立即释放,所以这才出现当循环执行 Open操作时,执行时间几乎为0.

下面我们先看一下不打开连接池时,循环执行 SqlConnection.Open 的耗时

 

 代码如下 复制代码

       public static void OpenWithoutPooling()
        {
            string connectionString =
                "Data Source=192.168.10.2; Initial Catalog=News; Integrated Security=True;Pooling=False;";

            Stopwatch sw = new Stopwatch();

            sw.Start();
            using (SqlConnection conn =
                new SqlConnection(connectionString))
            {
                conn.Open();
            }

            sw.Stop();
            Console.WriteLine("Without Pooling, first connection elaed {0} ms", sw.ElapsedMilliseconds);

            sw.Reset();

            sw.Start();

            for (int i = 0; i             {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                }
            }

            sw.Stop();
            Console.WriteLine("Without Pooling, average connection elapsed {0} ms", sw.ElapsedMilliseconds / 100);
        }

 

SqlConnection 默认是打开连接池的,如果要强制关闭,我们需要在连接字符串中加入 Pooling=False

调用程序如下:

 代码如下 复制代码
                Test.SqlConnectionTest.OpenWithoutPooling();
                Console.WriteLine("Waiting for 10s");
                System.Threading.Thread.Sleep(10 * 1000);
                Test.SqlConnectionTest.OpenWithoutPooling();
                Console.WriteLine("Waiting for 600s");
                System.Threading.Thread.Sleep(600 * 1000);
                Test.SqlConnectionTest.OpenWithoutPooling();

下面是测试结果 

Without Pooling, first connection elapsed 13 ms
Without Pooling, average connection elapsed 5 ms
Wating for 10s
Without Pooling, first connection elapsed 6 ms
Without Pooling, average connection elapsed 4 ms
Wating for 600s
Without Pooling, first connection elapsed 7 ms
Without Pooling, average connection elapsed 4 ms

从这个测试结果看,关闭连接池后,平均每次连接大概要耗时4个毫秒左右,这个就是建立物理连接的平均耗时。

 

下面再看默认情况下的测试代码

      

 代码如下 复制代码

  public static void OpenWithPooling()
        {
            string connectionString =
                "Data Source=192.168.10.2; Initial Catalog=News; Integrated Security=True;";
           
            Stopwatch sw = new Stopwatch();

            sw.Start();
            using (SqlConnection conn =
                new SqlConnection(connectionString))
            {
                conn.Open();
            }

            sw.Stop();
            Console.WriteLine("With Pooling, first connection elapsed {0} ms", sw.ElapsedMilliseconds);

            sw.Reset();

            sw.Start();

            for (int i = 0; i             {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                }
            }

            sw.Stop();
            Console.WriteLine("With Pooling, average connection elapsed {0} ms", sw.ElapsedMilliseconds / 100);
        }


调用代码

 

                Test.SqlConnectionTest.OpenWithPooling();
                Console.WriteLine("Waiting for 10s");
                System.Threading.Thread.Sleep(10 * 1000);
                Test.SqlConnectionTest.OpenWithPooling();
                Console.WriteLine("Waiting for 600s");
                System.Threading.Thread.Sleep(600 * 1000);
                Test.SqlConnectionTest.OpenWithPooling();
测试结果

With Pooling, first connection elapsed 119 ms
With Pooling, average connection elapsed 0 ms
Waiting for 10s
With Pooling, first connection elapsed 0 ms
With Pooling, average connection elapsed 0 ms
Waiting for 600s
With Pooling, first connection elapsed 6 ms
With Pooling, average connection elapsed 0 ms


这个测试结果看,第一次耗时是119ms,这是因为我在测试代码中,首先运行的是这个测试过程,119 ms 是程序第一次启动时的首次连接耗时,这个耗时可能不光包括连接的时间,还有 ado.net 自己初始化的用时,所以这个用时可以不管。10秒以后在执行这个测试过程,首次执行的时间变成了0ms,这说明连接池机制发生了作用,SqlConnection Close 后,物理连接并没有被关闭,所以10秒后再执行,连接几乎没有用时间。

但我们发现一个有趣的现象,10分钟后,首次连接时间变成了6ms,这个和前面不打开连接池的测试用时几乎一样,也就是说10分钟后,物理连接被关闭了,又重新打开了一个物理连接。这个现象是因为连接池有个超时时间,默认情况下应该在5-10分钟之间,如果在此期间没有任何的连接操作,物理连接就会被关闭。那么我们有没有办法始终保持物理连接呢?方法是有的。

连接池设置中有一个最小连接池大小,默认为0,我们把它设置为大于0的值就可以保持若干物理连接始终不释放了。看代码

 

 代码如下 复制代码

 

        public static void OpenWithPooling(int minPoolSize)
        {
            string connectionString =
                string.Format("Data Source=192.168.10.2; Initial Catalog=News; Integrated Security=True;Min Pool Size={0}",
                    minPoolSize);

            Stopwatch sw = new Stopwatch();

            sw.Start();
            using (SqlConnection conn =
                new SqlConnection(connectionString))
            {
                conn.Open();
            }

            sw.Stop();
            Console.WriteLine("With Pooling Min Pool Size={0}, first connection elapsed {1} ms",
                minPoolSize, sw.ElapsedMilliseconds);

            sw.Reset();

            sw.Start();

            for (int i = 0; i             {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                }
            }

            sw.Stop();
            Console.WriteLine("With Pooling Min Pool Size={0}, average connection elapsed {1} ms",
                minPoolSize, sw.ElapsedMilliseconds / 100);
        }


其实只要在连接字符串中加入一个 Min Pool Size=n 就可以了。

调用代码

 代码如下 复制代码

 

                Test.SqlConnectionTest.OpenWithPooling(1);
                Console.WriteLine("Waiting for 10s");
                System.Threading.Thread.Sleep(10 * 1000);
                Test.SqlConnectionTest.OpenWithPooling(1);
                Console.WriteLine("Waiting for 600s");
                System.Threading.Thread.Sleep(600 * 1000);
                Test.SqlConnectionTest.OpenWithPooling(1);
 

With Pooling Min Pool Size=1, first connection elapsed 5 ms
With Pooling Min Pool Size=1, average connection elapsed 0 ms
Waiting for 10s
With Pooling Min Pool Size=1, first connection elapsed 0 ms
With Pooling Min Pool Size=1, average connection elapsed 0 ms
Waiting for 600s
With Pooling Min Pool Size=1, first connection elapsed 0 ms
With Pooling Min Pool Size=1, average connection elapsed 0 ms


我们可以看到当 Min Pool Size = 1  时,除了首次连接用时5ms以外,即便过了10分钟,用时还是0ms,物理连接没有被关闭。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Gunakan kumpulan sambungan php-fpm untuk meningkatkan prestasi capaian pangkalan data Gunakan kumpulan sambungan php-fpm untuk meningkatkan prestasi capaian pangkalan data Jul 07, 2023 am 09:24 AM

Gambaran keseluruhan penggunaan kumpulan sambungan php-fpm untuk meningkatkan prestasi capaian pangkalan data: Dalam pembangunan web, capaian pangkalan data ialah salah satu operasi yang paling kerap dan memakan masa. Kaedah tradisional adalah untuk mencipta sambungan pangkalan data baharu untuk setiap operasi pangkalan data dan kemudian menutup sambungan selepas digunakan. Kaedah ini akan menyebabkan penubuhan dan penutupan sambungan pangkalan data yang kerap, meningkatkan overhed sistem. Untuk menyelesaikan masalah ini, anda boleh menggunakan teknologi kolam sambungan php-fpm untuk meningkatkan prestasi capaian pangkalan data. Prinsip kumpulan sambungan: Kolam sambungan ialah teknologi caching yang menggabungkan beberapa pangkalan data tertentu

Bagaimana untuk menutup kolam sambungan MySQL dengan betul dalam program Python? Bagaimana untuk menutup kolam sambungan MySQL dengan betul dalam program Python? Jun 29, 2023 pm 12:35 PM

Bagaimana untuk menutup kolam sambungan MySQL dengan betul dalam program Python? Apabila menulis program dalam Python, kita sering perlu berinteraksi dengan pangkalan data. Pangkalan data MySQL ialah pangkalan data hubungan yang digunakan secara meluas Dalam Python, kita boleh menggunakan pymysql perpustakaan pihak ketiga untuk menyambung dan mengendalikan pangkalan data MySQL. Apabila kami menulis kod berkaitan pangkalan data, isu yang sangat penting ialah cara menutup sambungan pangkalan data dengan betul, terutamanya apabila menggunakan kumpulan sambungan. Pengumpulan sambungan adalah pengurusan

Bagaimana untuk mengelakkan kebocoran sambungan rangkaian dalam pembangunan Java? Bagaimana untuk mengelakkan kebocoran sambungan rangkaian dalam pembangunan Java? Jun 30, 2023 pm 01:33 PM

Bagaimana untuk menyelesaikan masalah kebocoran sambungan rangkaian dalam pembangunan Java Dengan perkembangan pesat teknologi maklumat, sambungan rangkaian menjadi semakin penting dalam pembangunan Java. Walau bagaimanapun, masalah kebocoran sambungan rangkaian dalam pembangunan Java secara beransur-ansur menjadi ketara. Kebocoran sambungan rangkaian boleh menyebabkan kemerosotan prestasi sistem, pembaziran sumber, ranap sistem, dll. Oleh itu, menyelesaikan masalah kebocoran sambungan rangkaian telah menjadi penting. Kebocoran sambungan rangkaian bermakna sambungan rangkaian tidak ditutup dengan betul dalam pembangunan Java, mengakibatkan kegagalan sumber sambungan dikeluarkan, sekali gus menghalang sistem daripada berfungsi dengan baik. rangkaian penyelesaian

Bagaimana untuk menyediakan kolam sambungan MySQL menggunakan PHP? Bagaimana untuk menyediakan kolam sambungan MySQL menggunakan PHP? Jun 04, 2024 pm 03:28 PM

Menyediakan kumpulan sambungan MySQL menggunakan PHP boleh meningkatkan prestasi dan kebolehskalaan. Langkah-langkahnya termasuk: 1. Pasang sambungan MySQLi 2. Buat kelas kumpulan sambungan 3. Tetapkan konfigurasi kumpulan sambungan 5. Dapatkan dan lepaskan sambungan; Dengan pengumpulan sambungan, aplikasi boleh meningkatkan prestasi dengan mengelak daripada membuat sambungan pangkalan data baharu untuk setiap permintaan.

Penggunaan kolam sambungan MySQL dan teknik pengoptimuman dalam program ASP.NET Penggunaan kolam sambungan MySQL dan teknik pengoptimuman dalam program ASP.NET Jun 30, 2023 pm 11:54 PM

Bagaimana untuk menggunakan dan mengoptimumkan kolam sambungan MySQL dengan betul dalam program ASP.NET? Pengenalan: MySQL ialah sistem pengurusan pangkalan data yang digunakan secara meluas yang menampilkan prestasi tinggi, kebolehpercayaan dan kemudahan penggunaan. Dalam pembangunan ASP.NET, menggunakan pangkalan data MySQL untuk penyimpanan data adalah keperluan biasa. Untuk meningkatkan kecekapan dan prestasi sambungan pangkalan data, kami perlu menggunakan dan mengoptimumkan kumpulan sambungan MySQL dengan betul. Artikel ini akan memperkenalkan cara menggunakan dan mengoptimumkan kumpulan sambungan MySQL dengan betul dalam program ASP.NET.

Gunakan kumpulan sambungan MySQL dalam program Node.js untuk mengoptimumkan prestasi Gunakan kumpulan sambungan MySQL dalam program Node.js untuk mengoptimumkan prestasi Jun 30, 2023 pm 10:07 PM

Bagaimana cara menggunakan kumpulan sambungan MySQL dengan betul dalam program Node.js untuk mengoptimumkan prestasi? Dengan pembangunan berterusan aplikasi Internet, pangkalan data telah menjadi teras kepada kebanyakan aplikasi. Dalam Node.js, MySQL ialah salah satu pangkalan data hubungan yang paling biasa digunakan. Walau bagaimanapun, dalam situasi konkurensi yang tinggi, menggunakan sambungan MySQL secara langsung akan menyebabkan kemerosotan prestasi. Untuk menyelesaikan masalah ini, kami boleh menggunakan kumpulan sambungan MySQL untuk mengoptimumkan prestasi. Kolam sambungan ialah koleksi objek sambungan yang telah ditetapkan. Melalui kolam sambungan, aplikasi

Kemahiran penggunaan prestasi transaksi dan pengurusan kumpulan sambungan MySQL dalam Node.js Kemahiran penggunaan prestasi transaksi dan pengurusan kumpulan sambungan MySQL dalam Node.js Jun 30, 2023 pm 06:24 PM

Bagaimana untuk menggunakan dan mengurus prestasi transaksi kumpulan sambungan MySQL dengan betul dalam program Node.js? Pengenalan: Dengan pembangunan berterusan teknologi Internet, Node.js telah menjadi bahasa pembangunan bahagian pelayan yang sangat popular. Dalam kebanyakan aplikasi Web, prestasi transaksi pangkalan data memainkan peranan penting dalam kestabilan dan kebolehpercayaan sistem yang tinggi. MySQL ialah sistem pengurusan pangkalan data hubungan sumber terbuka yang digunakan secara meluas dalam program Node.js. Artikel ini akan memberi tumpuan kepada cara yang betul

Penjelasan terperinci tentang klien HTTP dan kumpulan sambungan rangka kerja Gin Penjelasan terperinci tentang klien HTTP dan kumpulan sambungan rangka kerja Gin Jun 23, 2023 am 10:19 AM

Rangka kerja Gin ialah rangka kerja web ringan yang direka bentuk untuk menyediakan model pemprosesan web berprestasi tinggi dan ketersediaan tinggi. Dalam rangka kerja Gin, klien HTTP dan kumpulan sambungan adalah komponen yang sangat penting. Artikel ini akan menyelidiki butiran pelaksanaan asas klien HTTP dan kumpulan sambungan dalam rangka kerja Gin. 1. Pelanggan HTTP Pelanggan HTTP ialah komponen teras dalam rangka kerja Gin untuk menghantar permintaan HTTP. Dalam rangka kerja Gin, terdapat banyak cara yang berbeza untuk melaksanakan klien HTTP, tetapi dua cara yang paling biasa digunakan ialah

See all articles