You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS上ASP.NET Core 5.0 API并发请求变慢问题求助

AWS上ASP.NET Core 5.0 API并发请求性能下降问题

TLDR; 部署在AWS上的ASP.NET Core 5.0 API,单请求查询MSSQL返回1-4k条数据耗时约500ms,表现正常,但4-5个请求同时到达时,每个请求耗时增至约2000ms,求原因。

我每次都是先打开数据库连接再初始化SqlCommand:

using (var connection = new SqlConnection(dbConnection))
connection.Open();
using (SqlCommand command = new SqlCommand(strSQLCommand))

试过用SqlDataAdapter填充DataTable,也试过用SqlDataReader填充自定义对象,两种方式都会出现类似的性能下降。查询返回约1-4k条不同类型数据,Postman显示解压后的JSON大小约1.95MB。性能下降仅在多请求并发时出现,不确定是数据库多连接处理问题,还是数据大小与内存导致的问题。分页不可行,必须返回全部数据。

最初的实现逻辑都在一个HttpGet方法中:

[HttpGet]
[Route("Foo")]
[Consumes("application/json")]
[EnableCors("DefaultPolicy")]
public IActionResult Foo([FromHeader] FooRequest request)
{
///stuff

DataTable dt = new DataTable();
using (var connection = new SqlConnection(_dataDBConnection))
{
    timer.Start();
    connection.Open();
    using (SqlCommand command = new SqlCommand(
        "SELECT foo.name, bar.first, bar.second, bar.third, bar.fourth 
         FROM dbo.foo with(nolock)
         JOIN dbo.bar with(nolock) ON bar.name = foo.name
         WHERE bar.date = @date", connection))
    {
        command.Parameters.AddWithValue("@date", request.Date.ToString("yyyyMMdd"));
        using (SqlDataAdapter adapter = new SqlDataAdapter(command))
        {
            adapter.Fill(dt);
        }
    }

    timer.Stop();

    long elapsed = timer.ElapsedMilliseconds;
}

///将DataTable的数据解析为List<object>并返回

///我也曾用DataReader直接将数据存入List<object>,但仍出现相同的性能下降情况。

///response是包含数组的类,返回SQL查询的所有数据
return new JsonResult(response);
}

--补充测试后的编辑---

[HttpGet]
[Route("Foo")]
[Consumes("application/json")]
[EnableCors("DefaultPolicy")]
public IActionResult Foo([FromHeader] FooRequest request)
{
///stuff

using (var connection = new SqlConnection(_dataDBConnection))
{
    connection.Open();
    ///此方式运行速度明显更快
    using (SqlCommand command = new SqlCommand(@"dbo.spGetFoo", connection))
    {
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddWithValue("@date", request.date.ToString("yyyyMMdd"));

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                ///将数据添加至待返回的列表
            }
        }
    }
}

///将DataTable的数据解析为List<object>并返回

///我也曾用DataReader直接将数据存入List<object>,但仍出现相同的性能下降情况。

///response是包含数组的类,返回SQL查询的所有数据
return new JsonResult(response);
}

--最终编辑 请务必阅读--
大家似乎纠结于DataAdapter和Fill部分,而没有通读全文。因此我在这里提供一个同样存在上述问题的最终示例。

[HttpGet]
[Route("Foo")]
[Consumes("application/json")]
[EnableCors("DefaultPolicy")]
public async Task<IActionResult> Foo([FromHeader] FooRequest request)
{
///stuff

using (var connection = new SqlConnection(_dataDBConnection))
{
    await connection.OpenAsync();
    ///此方式运行速度明显更快
    using (SqlCommand command = new SqlCommand(@"dbo.spGetFoo", connection))
    {
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddWithValue("@date", request.date.ToString("yyyyMMdd"));

        using (SqlDataReader reader = await command.ExecuteReaderAsync())
        {
            while (await reader.ReadAsync())
            {
                ///将数据添加至待返回的列表
            }
        }
    }
}

///将DataTable的数据解析为List<object>并返回

///response是包含数组的类,返回SQL查询的所有数据
return new JsonResult(response);
}

欢迎提供任何见解!

内容的提问来源于stack exchange,提问作者Anduril28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:41:12