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
相关产品推荐
相关产品推荐

