如何在 asp.net core 中编写一个高性能的 sql 查询应用程序?
Posted
技术标签:
【中文标题】如何在 asp.net core 中编写一个高性能的 sql 查询应用程序?【英文标题】:How to write a high performance sql query app in asp.net core? 【发布时间】:2021-05-08 08:41:17 【问题描述】:我创建了一个新的空 asp.net 核心项目并键入如下代码。 但 QPS 大约 600。(hello world test php 6000,asp.net core 10000,php with PDO 做同样的工作大约 1000)
Ubuntu 20.04 ab -c 1000 -n 50000 http://localhost:4246/
app.UseEndpoints(endpoints =>
endpoints.MapGet("/", async context =>
var list = new List<Dictionary<string, string>>();
mysqlConnection myConnnect;
MySqlCommand sqlCmd;
myConnnect = new MySqlConnection(constructorString);
sqlCmd = new MySqlCommand();
sqlCmd.Connection = myConnnect;
sqlCmd.CommandText = "select * from location where parent_id=0";
await myConnnect.OpenAsync();
using (var reader = await sqlCmd.ExecuteReaderAsync(System.Data.CommandBehavior.CloseConnection))
while (await reader.ReadAsync())
var data = new Dictionary<string, string>();
data["id"] = reader.GetInt32(0).ToString();
data["spell_first"] = reader.GetString(2);
data["spell_full"] = reader.GetString(3);
data["name"] = reader.GetString(4);
list.Add(data);
await context.Response.WriteAsync("Hello World!");
);
【问题讨论】:
确保硬件和网络性能良好。这些因素也起着重要作用 【参考方案1】:由于您的重点是单个线程每秒的查询次数,而不是针对运行查询的大量线程进行优化,您可以尝试让阅读器以非异步方式读取。这将避免在阅读记录时为您的线程切换上下文。
另外,这可能是一个更大的问题,使用字典来保存记录的字段将涉及更多的内存管理,然后为它们使用专用类,所以我建议也进行更改.最终代码可能如下所示:
[注意我没有运行这段代码,因为我没有你的数据库;-) 所以代码可能有语法错误]
public class Rec
public int Id;
public string SpellFirst;
public string SpellFull;
public string Name;
app.UseEndpoints(endpoints =>
endpoints.MapGet("/", async context =>
var list = new List<Rec>();
MySqlConnection myConnnect;
MySqlCommand sqlCmd;
myConnnect = new MySqlConnection(constructorString);
sqlCmd = new MySqlCommand();
sqlCmd.Connection = myConnnect;
sqlCmd.CommandText = "select * from location where parent_id=0";
await myConnnect.OpenAsync();
using (var reader = await sqlCmd.ExecuteReaderAsync(System.Data.CommandBehavior.CloseConnection))
while (reader.Read())
var rec = new Rec();
rec.Id = reader.GetInt32(0).ToString();
rec.SpellFirst = reader.GetString(2);
rec.SpellFull = reader.GetString(3);
rec.Name = reader.GetString(4);
list.Add(rec);
await context.Response.WriteAsync("Hello World!");
);
试一试,看看数字是多少。
【讨论】:
以上是关于如何在 asp.net core 中编写一个高性能的 sql 查询应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试