如何在 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 使用 内存缓存

如何在ASP.NET Core中编写高效的控制器

ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试

如何在 ASP.Net Core 中使用 条件中间件

ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试

在 ASP.NET Core 中使用 DbContext 注入并行 EF Core 查询