我有一个多线程 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);
}
请注意: - 执行过程的后台工作人员在完成后再次运行。- 数据库有太多锁,因为有数百个正在使用它。- 数据库在没有任何锁的情况下始终保持响应非常重要。-连接池正在保存一直处于休眠或挂起状态的连接。- 将程序添加到队列中的比例不会比执行它们的比例快。
我的问题是
使用这种方式更好还是使用许多连接不会影响数据库。