【问题标题】:How to write a high performance sql query app in asp.net core?如何在 asp.net core 中编写一个高性能的 sql 查询应用程序?
【发布时间】: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!");
        });

【问题讨论】:

  • 确保硬件和网络性能良好。这些因素也起着重要作用

标签: c# mysql asp.net asp.net-core ado.net


【解决方案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!");
        });

试一试,看看数字是多少。

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多