【问题标题】:What is the impact of setting the Max Pool Size option in a Sql Connection string in cpp/cli在 cpp/cli 的 Sql Connection 字符串中设置 Max Pool Size 选项有什么影响
【发布时间】:2018-11-13 14:07:16
【问题描述】:

我使用一个 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;
    }
}

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

有人告诉我要在连接字符串中设置 Max Pool Size 选项,但我看不出它会产生什么影响。

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

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

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

如果数据库已经在另一个软件中使用,有什么影响吗?

【问题讨论】:

  • 问题是你用一种方法打开一个连接并且在尝试另一个连接之前永远不会关闭它。这意味着锁会保留很长时间,一个连接可能会阻塞另一个连接。不要那样做。 只在需要时使用一个连接。连接池意味着您不会为此付出任何性能损失。检查What is the Managed C++ equivalent to the C# using statement。它展示了如何定义、使用和处置连接
  • @PanagiotisKanavos 你是说我应该在构建数据读取器后关闭连接吗?我在这门课上也有一个关闭的功能。这是有道理的,因为连接只使用一次(至少在这种情况下)。

标签: sql-server sqlconnection


【解决方案1】:

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

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

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

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

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

是否会改变并发SqlCommand的数量和后续 sqlDataReaders 我可以立即使用吗?在同一个 SqlConnection 上?某物 还有吗?

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

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

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

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

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

【讨论】:

  • 1):好的,所以超时确实来自那里。 2):我仍然只能通过 sqlconnection 使用一个命令/数据读取器,是这样吗? 3): 好吧,我使用相同的连接字符串,但我要问的是,无论第一次之后是否设置了选项,它是否会改变任何内容。 4):如果base已经在其中打开,选项的设置是否会影响它在另一个软件中的工作方式?
  • 1/ 运行的长/阻塞查询也可能产生超时 2/ 是 3/ 某些选项可能由 SqlConnection 属性设置,不管字符串 4/ 影响不取决于使用的事实MaxPoolSize,它取决于您的查询。通常,发现这类问题是 DBA 的工作。
  • 1):在 mssqlsms 中,所有查询几乎都是即时的,而且既然它现在可以工作,那就是问题所在。 3): 明白,无论如何我都会留下它,只是为了确定。 4):我假设 mssqlsms 和 sqlconnection 对象使用相同的池(提示挂起)。因此,池大小将由指定它的最后一个查询确定。我不相信降低池大小会剔除任何额外的连接,但从现在开始,我将确保在我的软件运行时避免运行 mssqlsms。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-09-17
  • 2013-10-13
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多