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

时间:2018-11-13 14:07:17

标签: sql-server sqlconnection

我使用CS便利类来处理我的SQL查询。 它是基本的,您可以通过指定数据库名称来实例化,并且它一次只能管理一个命令/数据读取器二重奏。

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;
    }
}

照原样,在代码的多线程部分中,我经常会超时。这似乎是由于我的并发连接数量太高。 (如果我在超时时输入debug并尝试在mssqlsms中执行查询,它将挂起,直到停止调试为止。)

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

是否更改了我可以插入同一数据库的SqlConnections数量?

它是否更改了我可以一次使用的并发SqlCommand和后续的sqlDataReaders的数量?在同一个SqlConnection上? 还有吗?

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

如果该数据库已经在另一个软件中使用了,是否有效果?

1 个答案:

答案 0 :(得分:0)

在多线程环境中,推荐的方案是

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

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

  

它是否更改了我可以插入到相同的SqlConnections的数量   数据库?

是的,当打开/使用的SqlConnection的计数> MaxPoolSize时,应用程序正在等待,直到将释放池连接为止。

  

是否更改并发SqlCommand和后续的数量   我可以一次使用sqlDataReaders吗?在同一个SqlConnection上?东西   还有吗?

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

  

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

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

  

如果该数据库已经在另一个数据库中使用了,是否有任何效果?   软吗?

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