Asp.net异步数据库连接没有重用连接

时间:2015-04-24 12:41:19

标签: asp.net asynchronous ado.net

我有一个.net mvc / sql server网站,用于高流量应用程序。我正在使用异步数据库连接。

在发布之前,我进行了负载测试,在负载下它很快就爆炸了。连接池快速耗尽连接。

在数据库级别运行sp_who会显示一堆正在等待命令的连接。如果我切换到非异步,则不会发生这种情况。

因此,新数据库调用似乎没有使用连接池中的连接,而是打开自己的新连接。这很快就会耗尽连接池限制,并开始超时查询。

以下是我用来执行异步datareader的帮助程序。有没有人在这看到任何问题?

private async Task<List<T>> ExecuteReaderAsync<T>(SqlCommand command, Func<SqlDataReader, T> rowConverter)
{
    List<T> ret = new List<T>();
    using (SqlConnection connection = new SqlConnection(this.ConnectionString))
    {
        command.Connection = connection;
        await connection.OpenAsync();
        using (SqlDataReader reader = await command.ExecuteReaderAsync())
        {                    
            while (await reader.ReadAsync())
            {
                ret.Add(rowConverter(reader));
            }
            reader.Close();
        }
        connection.Close();
    }
    return ret;
}

我像下面这样调用像datareader帮助器一样的代码:

public async Task<Content> FindContentAsync(int id)
{
    Content content = null;
    using (SqlCommand command = CreateProcedure("dbo.FindContent"))
    {
        AddParam(command, "Id", SqlDbType.Int, id);
        List<Content> items = await ExecuteReaderAsync<Content>(command, x => BindContent(x));
        if (items.Count > 0)
        {
            content = items[0];
        }
    }
    return content;
}

从帮助者那里打电话:

    public async Task<Content> FindAsync(int id)
    {
        var db = new DataAccess();
        var content = await db.FindContentAsync(id);
        return content;
    }

0 个答案:

没有答案