在 cpp/cli 中的 Sql 连接字符串中设置最大池大小选项有什么影响

What is the impact of setting the Max Pool Size option in a Sql Connection string in cpp/cli

我使用 cs 便利工具 class 来处理我的 sql 查询。 它是基本的,您通过指定数据库名称来实例化,它一次只能管理一个 command/datareader duo。

public static void      Connect     (string DBName)
{
    string connectionString =
        "Server=serverNaaaaaaaaame;Database=" 
        + DBName 
        + ";Integrated Security=SSPI;";
    try
    {
        if (cnn != null)
            cnn.Close ();
        cnn = new SqlConnection (connectionString);
        cnn.Open ();
    }
    catch (Exception e)
    {
        string aaaaaa = e.Message;
    }

}
public void     Command     (string command)
{
    try
    {
        if (drd != null)
            drd.Dispose ();
        if (cmd != null)
            cmd.Dispose ();
        cmd = new SqlCommand (command, cnn);
        //cmd.CommandTimeout = 300;
        drd = cmd.ExecuteReader ();
    }
    catch (Exception e)
    {
        string aaaaaa = e.Message;
    }
}

事实上,在我的代码的多线程部分,我经常遇到超时。这似乎是由于我的并发连接量太高。 (如果我在超时时进入调试并尝试在 mssqlsms 中执行查询,它会挂起直到我停止调试。)

有人告诉我要在连接字符串中设置最大池大小选项,但我看不出它有什么影响。

它会改变我可以插入同一数据库的 SqlConnections 的数量吗?

它会改变我可以同时使用的并发 SqlCommand 和后续 sqlDataReader 的数量吗?在同一个 SqlConnection 上? 还有别的吗?

我是否必须在所有连接字符串中指定它?

如果数据库已经在另一个软件中使用,是否有任何影响?

在多线程环境中推荐的场景是

  • 打开 SqlConnection(这会创建或获取池中的现有连接)
  • 用readers/commands
  • 处理数据
  • 尽快关闭 SqlConnection 以释放池连接以供其他线程使用)

According MSDN,MaxPoolSize 限制池中的并发连接数(对于每个 unique 连接字符串)。

Does it change the quantity of SqlConnections I can plug to the same database?

是的,当 open/used SqlConnection 的计数 > MaxPoolSize 时,应用程序正在等待直到池连接被释放。

Does it change the amount of concurrent SqlCommand and subsequent sqlDataReaders I can use at once? On the same SqlConnection? Something else?

是的,正如上面所说,并发连接数受 MaxPoolSize 限制。 但是,SqlDataReader 依赖于 SqlConnection,您可以(顺序地)在同一个连接中使用多个读取器(另请参阅多个记录集的 MARS 选项)。

Do I have to specify it in all my connection strings?

通常,您只需要一个用于池化的连接字符串。否则你需要管理多个池。

Does it have any effect if the database is already in use in another soft?

是的,您的查询会影响 DBMS 性能,甚至可能会锁定同一数据库中其他应用程序执行的某些处理。 但是,这个问题不是多线程特有的。