简单的多线程c# exe来测试SQL存储过程的可伸缩性
本文关键字:SQL 存储过程 可伸缩性 测试 exe 多线程 简单 | 更新日期: 2023-09-27 18:08:56
我有一个电子邮件应用程序,它将被调用,以在每次页面加载时向UI提供给定用户的新消息数量。我有一些变化的东西,我正在测试的DB级别,但所有的存储过程调用抽象。
我试图抨击DB,看看什么断点将通过创建一个简单的多线程应用程序调用进程多次,并在网格中显示结果的时间戳。然后向下滚动网格,查看从第一个结果到最后一个结果的持续时间,以确定每秒可以处理多少个结果。
我认为这是因为SQL应该能够每秒处理数百个这样的调用,但时间戳显示每秒只有4个。对于基于聚集索引列中的ID选择值来说,这似乎太长了。
简而言之,我有一个这样的表userId, newMsgCount,在userId上有一个聚集索引。SQL应该能够每秒处理数百个这样的响应。我认为落后的是我的。net应用程序。
我如何使这是一个很好的测试,以实现基于SQL性能的测试结果?
我有一个文本框,需要一些DB调用和一个按钮来调用测试,然后是一个网格来显示结果。
private void btnSend_Click(object sender, EventArgs e)
{
int count = Convert.ToInt32(txtThreadCount.Text);
dtStatus = new DataTable();
dtStatus.Columns.Add(new DataColumn("Thread No."));
//dtStatus.Columns.Add("User Id");
dtStatus.Columns.Add("Count");
dtStatus.Columns.Add("time");
for (int i = 0; i < count; i++)
{
ThreadPool.QueueUserWorkItem(GetMessageCount, i);
}
MessageBox.Show("Results retrieved successfully. 'n Please see the result tab.");
grdEmail.DataSource = dtStatus;
grdEmail.Refresh();
}
private static void GetMessageCount(object threadContext)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = new SqlConnection();
cmd.Connection.ConnectionString = "Data Source=server1;Initial Catalog=emails;Persist Security Info=True;User ID=IS_User;Password=M1";
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sel_Message_New_Count";
cmd.Parameters.AddWithValue("@UserId", 4);
SqlDataAdapter da = new SqlDataAdapter();
DataSet ds = new DataSet();
da.SelectCommand = cmd;
da.Fill(ds);
if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
DataRow dr = dtStatus.NewRow();
dr[0] = dtStatus.Rows.Count + 1;
//dr[1] = 1;
dr[1] = ds.Tables[0].Rows[0][0];
dr[2] = DateTime.Now.ToString("hh:mm.ss:ffff");
dtStatus.Rows.Add(dr);
}
}
您可能想尝试更改ThreadPool正在使用的线程数。参见ThreadPool。SetMinThreads方法。
- 你有大量内存泄漏问题。您需要
SQLCommand
,SQLConnection
,SQLDataAdapter
的using
声明。 - 不要使用DataSet,使用DataTable并在
using
语句中处理它。 - 你确定DataTable.NewRow()是一个线程安全的结构,因此你可以猛摔它的行?
- 为什么要在按钮点击事件中执行代码?按钮单击事件应该生成一个后台线程,该线程依次执行当前按钮单击事件中的代码。然后UI应该显示一个状态栏,指示该后台线程的进程…
你的问题的核心是你没有等待所有你产生的线程池线程完成。您启动它们,然后立即显示一个MessageBox。
你需要等待每个线程完成。
你是怎么做到的?这里有一个解决方案——或者——如果你正在使用。net 4和任务并行库,你可以尝试使用Parallel.For
。