Heim Datenbank MySQL-Tutorial SqlConnection 的连接池机制解析

SqlConnection 的连接池机制解析

Jun 07, 2016 pm 05:48 PM
连接池

提供一篇关于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,物理连接没有被关闭。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Verwenden Sie den PHP-FPM-Verbindungspool, um die Leistung des Datenbankzugriffs zu verbessern Verwenden Sie den PHP-FPM-Verbindungspool, um die Leistung des Datenbankzugriffs zu verbessern Jul 07, 2023 am 09:24 AM

Überblick über die Verwendung des PHP-FPM-Verbindungspools zur Verbesserung der Datenbankzugriffsleistung: In der Webentwicklung ist der Datenbankzugriff einer der häufigsten und zeitaufwändigsten Vorgänge. Die herkömmliche Methode besteht darin, für jeden Datenbankvorgang eine neue Datenbankverbindung zu erstellen und die Verbindung nach der Verwendung zu schließen. Diese Methode führt zu häufigem Aufbau und Schließen von Datenbankverbindungen, was den Systemaufwand erhöht. Um dieses Problem zu lösen, können Sie die PHP-FPM-Verbindungspooltechnologie verwenden, um die Leistung des Datenbankzugriffs zu verbessern. Prinzip des Verbindungspools: Der Verbindungspool ist eine Caching-Technologie, die eine bestimmte Anzahl von Datenbanken kombiniert

Wie schließe ich den MySQL-Verbindungspool in einem Python-Programm richtig? Wie schließe ich den MySQL-Verbindungspool in einem Python-Programm richtig? Jun 29, 2023 pm 12:35 PM

Wie schließe ich den MySQL-Verbindungspool in einem Python-Programm richtig? Beim Schreiben von Programmen in Python müssen wir häufig mit Datenbanken interagieren. Die MySQL-Datenbank ist eine weit verbreitete relationale Datenbank. In Python können wir die Drittanbieterbibliothek pymysql verwenden, um die MySQL-Datenbank zu verbinden und zu betreiben. Wenn wir datenbankbezogenen Code schreiben, ist es ein sehr wichtiges Thema, wie die Datenbankverbindung korrekt geschlossen wird, insbesondere wenn ein Verbindungspool verwendet wird. Verbindungspooling ist eine Verwaltung

Wie vermeidet man Netzwerkverbindungslecks bei der Java-Entwicklung? Wie vermeidet man Netzwerkverbindungslecks bei der Java-Entwicklung? Jun 30, 2023 pm 01:33 PM

So lösen Sie das Problem des Netzwerkverbindungsverlusts in der Java-Entwicklung Mit der rasanten Entwicklung der Informationstechnologie wird die Netzwerkverbindung in der Java-Entwicklung immer wichtiger. Das Problem des Verlusts von Netzwerkverbindungen in der Java-Entwicklung ist jedoch allmählich in den Vordergrund gerückt. Netzwerkverbindungslecks können zu einer Verschlechterung der Systemleistung, Ressourcenverschwendung, Systemabstürzen usw. führen. Daher ist die Lösung des Problems von Netzwerkverbindungslecks von entscheidender Bedeutung. Netzwerkverbindungslecks bedeuten, dass die Netzwerkverbindung in der Java-Entwicklung nicht korrekt geschlossen wird, was dazu führt, dass Verbindungsressourcen nicht freigegeben werden und das System nicht ordnungsgemäß funktioniert. Lösungsnetzwerk

Wie richte ich einen MySQL-Verbindungspool mit PHP ein? Wie richte ich einen MySQL-Verbindungspool mit PHP ein? Jun 04, 2024 pm 03:28 PM

Das Einrichten eines MySQL-Verbindungspools mit PHP kann die Leistung und Skalierbarkeit verbessern. Die Schritte umfassen: 1. Installieren Sie die MySQLi-Erweiterung. 2. Erstellen Sie eine Verbindungspool-Konfiguration. 4. Erstellen Sie eine Verbindungspool-Instanz. Mit Verbindungspooling können Anwendungen die Leistung verbessern, indem sie vermeiden, für jede Anfrage eine neue Datenbankverbindung zu erstellen.

Nutzung und Optimierungstechniken des MySQL-Verbindungspools in ASP.NET-Programmen Nutzung und Optimierungstechniken des MySQL-Verbindungspools in ASP.NET-Programmen Jun 30, 2023 pm 11:54 PM

Wie verwende und optimiere ich den MySQL-Verbindungspool in ASP.NET-Programmen richtig? Einführung: MySQL ist ein weit verbreitetes Datenbankverwaltungssystem, das sich durch hohe Leistung, Zuverlässigkeit und Benutzerfreundlichkeit auszeichnet. Bei der ASP.NET-Entwicklung ist die Verwendung einer MySQL-Datenbank zur Datenspeicherung eine häufige Anforderung. Um die Effizienz und Leistung von Datenbankverbindungen zu verbessern, müssen wir den MySQL-Verbindungspool korrekt verwenden und optimieren. In diesem Artikel erfahren Sie, wie Sie den MySQL-Verbindungspool in ASP.NET-Programmen korrekt verwenden und optimieren.

Verwenden Sie den MySQL-Verbindungspool im Node.js-Programm, um die Leistung zu optimieren Verwenden Sie den MySQL-Verbindungspool im Node.js-Programm, um die Leistung zu optimieren Jun 30, 2023 pm 10:07 PM

Wie verwende ich den MySQL-Verbindungspool im Node.js-Programm richtig, um die Leistung zu optimieren? Mit der kontinuierlichen Weiterentwicklung von Internetanwendungen sind Datenbanken zum Kern der meisten Anwendungen geworden. In Node.js ist MySQL eine der am häufigsten verwendeten relationalen Datenbanken. In Situationen mit hoher Parallelität führt die direkte Verwendung von MySQL-Verbindungen jedoch zu Leistungseinbußen. Um dieses Problem zu lösen, können wir den MySQL-Verbindungspool verwenden, um die Leistung zu optimieren. Ein Verbindungspool ist eine Sammlung etablierter Verbindungsobjekte. Über den Verbindungspool kann die Anwendung

Transaktionsleistung, Nutzung und Verwaltungsfähigkeiten des MySQL-Verbindungspools in Node.js Transaktionsleistung, Nutzung und Verwaltungsfähigkeiten des MySQL-Verbindungspools in Node.js Jun 30, 2023 pm 06:24 PM

Wie verwende und verwalte ich die Transaktionsleistung des MySQL-Verbindungspools im Node.js-Programm richtig? Einführung: Mit der kontinuierlichen Weiterentwicklung der Internettechnologie hat sich Node.js zu einer sehr beliebten serverseitigen Entwicklungssprache entwickelt. In vielen Webanwendungen spielt die Transaktionsleistung der Datenbank eine entscheidende Rolle für die Stabilität und hohe Zuverlässigkeit des Systems. MySQL ist ein relationales Open-Source-Datenbankverwaltungssystem, das häufig in Node.js-Programmen verwendet wird. In diesem Artikel geht es darum, wie man es richtig macht

Detaillierte Erläuterung des HTTP-Clients und des Verbindungspools des Gin-Frameworks Detaillierte Erläuterung des HTTP-Clients und des Verbindungspools des Gin-Frameworks Jun 23, 2023 am 10:19 AM

Das Gin-Framework ist ein leichtes Web-Framework, das ein leistungsstarkes und hochverfügbares Webverarbeitungsmodell bereitstellen soll. Im Gin-Framework sind HTTP-Client und Verbindungspool sehr wichtige Komponenten. In diesem Artikel werden die zugrunde liegenden Implementierungsdetails des HTTP-Clients und des Verbindungspools im Gin-Framework erläutert. 1. HTTP-Client Der HTTP-Client ist die Kernkomponente im Gin-Framework zum Senden von HTTP-Anfragen. Im Gin-Framework gibt es viele verschiedene Möglichkeiten, HTTP-Clients zu implementieren, aber die beiden am häufigsten verwendeten sind

See all articles