Npgsql性能

时间:2018-09-02 02:48:54

标签: ado.net npgsql

我正在尝试在DAL中实现Npgsql并在高负载下遇到问题。以下示例应用程序很好地表示了一个简单的查询,该查询在重负载下会引发“命令正在执行中”异常。我以为这是由于缺少MARS支持所致,所以我每次都在每个命令周围使用using语句尝试创建连接,只是使性能变得不可用。我检查了用户名是否已编入索引,所以应该不成问题。

不确定我在这里做错了什么,但是我需要一些有关如何使它表现良好的建议。

操作系统:Docker容器:microsoft / dotnet:2.1.301-sdk

using Npgsql;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Threading.Tasks;

namespace npgsqlTest
{
class Program
{
    static async Task Main(string[] args)
    { 
        DAL dal = new DAL();

        dal.Prepare();

        var tasks = dal.Users.Select(async user =>
        {
            Console.WriteLine(await dal.RunTest(user));
        });
        await Task.WhenAll(tasks);
    }
}

public class DAL
{
    private static string _ConnectionString;
    private NpgsqlConnection _Connection;

    public List<string> Users { get; set; } = new List<string>();


    public DAL()
    {
        _ConnectionString = $"Host=192.168.1.1;Username=admin;Port=5432;Password=password;Database=BigDB;";
        _Connection = new NpgsqlConnection(_ConnectionString);
        _Connection.Open();
    }

    public void Prepare()
    {
        string query = "SELECT username FROM usertable;";

        using (var cmd = new NpgsqlCommand(query, _Connection))
        {
            var reader = cmd.ExecuteReader();

            using (reader)
            {
                while (reader.Read())
                {
                    Users.Add(reader[0].ToString());
                }
            }
        }
    }

    public async Task<string> RunTest(string user)
    {
        var parameters = new Dictionary<string, Object> { { "username", user } };

        var query = $"SELECT name FROM usertable WHERE username = (@username);";

        var reader = await QueryAsync(query, parameters);

        using (reader)
        {
            if (reader.HasRows)
            {
                while (await reader.ReadAsync())
                {
                    var name = reader["name"];

                    if (!(hash is DBNull))
                        return (string)name;
                }
            }
        }

        return String.Empty;
    }

    public async Task<DbDataReader> QueryAsync(string query, Dictionary<string, Object> parameters)
    {
        using (var cmd = new NpgsqlCommand(query, _Connection))
        {
            foreach (var parameter in parameters)
            {
                cmd.Parameters.AddWithValue(parameter.Key, parameter.Value == null ? DBNull.Value : parameter.Value);
            }
            cmd.Prepare();
            return await cmd.ExecuteReaderAsync();
        }
    }
}
}

0 个答案:

没有答案