c# - 何时在 C# 中使用 SqlConnection.ClearAllPools()

标签 c# sql-server

我注意到在几秒钟内执行 200 次插入查询后,我的代码在 sqlWrite.ExecuteNonQuery(); 上出错。我一直认为 using 将确保资源被正确重用,并且不需要做任何事情。这是我第一次遇到这个错误,我已经处理 sql/c# 近 3 年了,做了不同的事情。

using (SqlConnection varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
{
    using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) 
    {
        sqlWrite.Parameters.AddWithValue("@var_agr_fname", var_agr_fname == "" ? (object) DBNull.Value : var_agr_fname);
        sqlWrite.ExecuteNonQuery();
    }
}


public static SqlConnection sqlConnectOneTime(string varSqlConnectionDetails)
{
    var sqlConnection = new SqlConnection(varSqlConnectionDetails);
    try
    {
        sqlConnection.Open();
    }
    catch
    {
        DialogResult result = MessageBox.Show(new Form {TopMost = true},
                                              "Błąd połączenia z bazą danych. Czy chcesz spróbować nawiązac połączenie ponownie?",
                                              "Błąd połączenia (000001)",
                                              MessageBoxButtons.YesNo,
                                              MessageBoxIcon.Stop);
        if (result == DialogResult.No)
        {
            if (Application.MessageLoop)
            {
                Application.Exit(); // Use this since we are a WinForms app
            }
            else
            {
                Environment.Exit(1); // Use this since we are a console app
            }
        }
        else
        {
            sqlConnection = sqlConnectOneTime(varSqlConnectionDetails);
        }
    }
    return sqlConnection;
}

错误消息:向服务器发送请求时发生了传输级错误。 (提供程序:共享内存提供程序,错误:0 - 管道的另一端没有进程。)

考虑对 this error 的建议我应该使用 SqlConnection.ClearAllPools(); 来确保正确重置或丢弃连接。所以我可以使用它,但问题是何时何地使用它?如何知道限制是否会被打破?极限在哪里?在 50/150/200 时?还是我应该在循环中每次都使用它?

最佳答案

首先,让我说这段代码很糟糕。您将 UI 与数据连接创建混合在一起。更重要的是,您在 catch 部分中显示一个对话窗口并进行递归调用!这是非常困惑的,它本身会导致错误和不可预测的行为。并且(原始)格式使其难以阅读。很抱歉提出严厉的评论,但您真的应该重新设计这段代码。

除此之外,您的代码应该可以正常工作,但如果您收到 No process is on the other end of the pipe. 错误,则表示您的数据库和/或 SQL Server 有问题.看起来它被堵塞了,只是不接受任何更多的连接。如果您在短时间内运行一批插入,请尽可能在一个连接上执行。 ClearAllPools 是一种在发生错误时恢复的方法,最好找出它是什么而不是掩盖它。这就像在 dentry 疼痛时服用扑热息痛却从不去看牙医。

另一件事是使用多个 SqlConnections 为每个连接创建单独的事务。这会增加 SQL Server 的负载,尽管它每秒确实可以处理数百个以上的事务。

此外,您可以将传输更改为命名管道和 TCP,以查看它是否有任何变化。

关于c# - 何时在 C# 中使用 SqlConnection.ClearAllPools(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10019730/

相关文章:

sql - 重新排序 SQL Server 数据库中的项目

c# - 无法将窗口置于样式中 (WPF)

c# - 如何对包含异步调用的方法进行单元测试?

c# - 如何检测用户控件是在 IDE 中、在 Debug模式中还是在发布的 EXE 中运行?

c# - 如何停止父窗体上的计时器 (C#)

sql - 如何使用 SQL 创建事件的内部编号

sql - 查找具有特定表的数据库或在 SQL Server 的每个数据库中查找表

sql-server - 所有 SQL Server 版本都会自动重建索引还是有默认的重建标准?

sql-server - SQL查询当前不支持返回别名

c# - Ninject 特定于构造函数的代码顺序