0

我有一个多线程 Windows 应用程序,它使用的不仅仅是后台工作程序。每个后台工作人员都在使用一些代码来更新同一个 SQL Server 数据库,并在完成后再次运行。我注意到每个后台工作人员都使用一个连接。我创建了一个自定义类的 ConcurrentQueue 以将所有存储过程添加到其中并从单个 backgorundworker 执行它以仅使用一个连接,因为在使用多个连接时数据库变得非常慢。这是我的代码
这是存储过程类

    string _procName;
    Dictionary<string, object> _parameters;
    public string ProcName
    {
        get { return _procName; }
        set { _procName = value; }
    }


    public Dictionary<string, object> Parameters
    {
        get { return _parameters; }
        set { _parameters = value; }
    }

    public PSCProc(string procName, Dictionary<string, object> parameters)
    {
        _procName = procName;
        _parameters = parameters;
    }  

这是用于运行存储过程的方法

 public static void execProc(string procName, Dictionary<string, object> parameters)
    {

        using (var conn = new SqlConnection(Test.Properties.Settings.Default.testConnection))
        using (var command = new SqlCommand(procName, conn)
        {
            CommandType = CommandType.StoredProcedure
        })
        {
            foreach (var item in parameters)
            {
                command.Parameters.AddWithValue(item.Key, item.Value);
            }
            conn.Open();
            command.ExecuteNonQuery();
            conn.Close();
            Form1.updated++;
        }
    }

这就是我将项目添加到队列中的方式

Dictionary<string, object> parameters = new Dictionary<string, object>();
            int x = 1;
            string address = "cairo";
            parameters.Add("@id", x);
            parameters.Add("@address", address);
            PSCProc proc1 = new PSCProc("updateAddress", parameters);
            pscQueue.Enqueue(proc1);

这就是我如何运行后台工作者来运行程序

 PSCProc proc;
            if (pscQueue.TryDequeue(out proc))
            {
                helper.execProc(proc.ProcName, proc.Parameters);
            }

请注意: - 执行过程的后台工作人员在完成后再次运行。- 数据库有太多锁,因为有数百个正在使用它。- 数据库在没有任何锁的情况下始终保持响应非常重要。-连接池正在保存一直处于休眠或挂起状态的连接。- 将程序添加到队列中的比例不会比执行它们的比例快。

我的问题是

使用这种方式更好还是使用许多连接不会影响数据库。

4

2 回答 2

0

我会制作一个运行您的存储过程的 SQL 代理作业。然后您的连接可以登录、启动作业和退出,SQL 代理将在后台运行作业。这样,程序运行时您的连接就不会保持打开状态。

话虽这么说,我敢打赌你的数据库并不慢,因为有很多连接,我敢打赌它很慢,因为它代表这些连接运行大量查询。但是,如果不知道存储过程的代码或架构,就真的不可能知道。

于 2013-09-17T22:52:49.673 回答
0

根据实际数量,连接数量可能会降低 SQL Server 的速度。

瘦身的一种方法是检查应用程序是否正确使用连接池。请参阅此 MSDN 文章以获取正确信息。很大程度上取决于连接字符串和连接所在的状态。(如果有打开的事务,则无法合并不同的凭据)

另一种方法是将过程的执行移至中央服务并让该服务缓存数据库请求/响应。

最后我会看看程序/查询本身;你提到有很多锁定正在进行。尝试找出原因。您是否在表格末尾创建了插入热点?索引可能有助于删除热点。(插入)触发器可能会妨碍您。有关更多详细信息,请参阅此帖子

于 2013-09-18T06:23:58.127 回答