简单的多线程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);
    }
}

简单的多线程c# exe来测试SQL存储过程的可伸缩性

您可能想尝试更改ThreadPool正在使用的线程数。参见ThreadPool。SetMinThreads方法。

  • 你有大量内存泄漏问题。您需要SQLCommand, SQLConnection, SQLDataAdapterusing声明。
  • 不要使用DataSet,使用DataTable并在using语句中处理它。
  • 你确定DataTable.NewRow()是一个线程安全的结构,因此你可以猛摔它的行?
  • 为什么要在按钮点击事件中执行代码?按钮单击事件应该生成一个后台线程,该线程依次执行当前按钮单击事件中的代码。然后UI应该显示一个状态栏,指示该后台线程的进程…

你的问题的核心是你没有等待所有你产生的线程池线程完成。您启动它们,然后立即显示一个MessageBox。

你需要等待每个线程完成。

你是怎么做到的?这里有一个解决方案——或者——如果你正在使用。net 4和任务并行库,你可以尝试使用Parallel.For