环境:
- window11
- sqlserver 2014 x64
- .net 6.0
- vs2022
- Microsoft.Data.SqlClient 5.1.0
一、SQL sever中的最大并发连接数
顾名思义,sqlserver中的最大并发连接数就是你能同时有多少个到sqlserver数据库的连接。
但是,一般情况下我们感受不到这个限制,那是因为:sqlserver默认安装后是不限制最大并发连接数的,如果需要,我们可以手动打开。
设置的方式如下:
修改后记得重启sqlserver!
SQL sever的最大并发是多少?
当我们没有设置最大并发量的时候,sqlserver能支持多少呢?
可以看下面的例子:
using Microsoft.Data.SqlClient;
using System;
public class Program
{
public static void Main(string[] args)
{
var connStr = "Data Source=172.26.196.216;Initial Catalog=master;User ID=sa;Password=123456;Pooling=False;TrustServerCertificate=True";
var list = new List<SqlConnection>();
for (int i = 0; i < 50000; i++)
{
try
{
var conn = new SqlConnection(connStr);
Console.WriteLine($"第 {i + 1} 个链接正尝试打开...");
conn.Open();
list.Add(conn);
var cmd = conn.CreateCommand();
cmd.CommandText = "select USER";
var str = cmd.ExecuteScalar();
Console.WriteLine($"第 {i + 1} 个链接打开成功 str={str}");
}
catch (Exception ex)
{
Console.WriteLine($"第 {i + 1} 个链接打开异常: {ex.Message}");
}
}
Console.WriteLine("ok");
Console.ReadLine();
}
}
随着,链接越开越多,程序会越来越卡,尤其是1万以后,如下:
所以,并发越少越好,一般默认100。
备注: 本人在做并发测试的时候,不小心将最大并发连接数设为1,重启服务器后,发现连不上了,差点重装数据库。最后,把sqlserver的非实例服务全部停掉,用命令行登录数据库修改回来的。所以,不要设太小,即使你在测试。。。
二、应用程序连接SQL server
参照:关于Sql Server最大连接数(Max Pool Size)的配置问题
当我们用程序访问SQL server的时候,我们一般设置链接字符串如下:
Data Source=172.26.196.216;Initial Catalog=master;User ID=sa;Password=123456;TrustServerCertificate=True;
其实,上面的连接字符串中还有很多其他的参数,比如:
Pooling=true
Max Pool Size=100
Min Pool Size=0
Connect Timeout=15
注:上面列举了四个参数的默认值,Connect Timeout是15秒。
所以,上面的连接字符串等同于:
Data Source=172.26.196.216;Initial Catalog=master;User ID=sa;Password=123456;TrustServerCertificate=True;Pooling=true;Max Pool Size=100;Min Pool Size=0;Connect Timeout=15;
这些默认值可以在调试的时候观察到:
所以,如果我们在项目中使用这种连接字符串而项目访问数据库的并发数比较大的情况下,就会出现以下的问题:
当遇到这种问题的时候,我们就需要手动的将Max Pool Size
调高一点,具体多少可以参照项目承受的并发量。
那么,上面的参数Pooling
、Max Pool Size
等分别表示什么意思呢?
其实,我们在访问数据库的时候是使用的ado.net技术,微软提供的这套技术在底层默认开启了数据库连接池,也就是Pooling
默认为true。那么默认连接池里的最大连接数据是多少呢?这就使Max Pool Size
参数。而Min Pool Size
就表示连接池中最小的连接数量,Connect Timeout
表示一次连接请求最长的等待时间。
数据库连接池的大概工作原理如下:
当我们使用连接池的时候,我们每次创建SqlConnection的时候,.net都会从连接池中找出空闲的连接供我们使用,如果没找到的话就观察池子里的连接数量是否超出了最大连接数的设置,没超出的话就新开初始化个连接返给我们,超出的话就让我们等待直到有空闲的连接返回到池子里,如果我们等待超期了就直接返回异常了。还有,当我们用完连接调用S起来Connection的Close方法后,.net就会自动回收连接到池子里了。