检测Azure Sql数据库上的漏洞连接

时间:2016-04-14 18:35:42

标签: sql-server connection-pooling azure-sql-database

我有一个非常繁忙的应用程序,只需要大约10到20个连接(通过sp_who2)就可以了,但偶尔连接会出现峰值(300 - 500),Azure Sql Database将开始终止它们。这会导致应用程序死亡。它很少发生,但现在我们添加了第三个应用程序。

目前有4个不同的应用程序访问数据库 - 管理站点和应用程序的三个不同实例。

因此,如果没有Sql Server Profiler,如何确定泄漏的来源?

另外,该应用程序主要使用Entity Framework 6,但一些更复杂/使用频繁的数据访问方法使用一些自定义存储过程和ado.net代码。这是一个例子,以防任何人可以确定这是否是一个潜在的问题:

public Content FindContent(int id)
{
    Content content = null;
    using (SqlCommand command = CreateProcedure("dbo.FindContent"))
    {
        AddParam(command, "Id", SqlDbType.Int, id);

        var results = ExecuteReader<Content, Content, ContentFile>(command, x => BindContent(x), x => BindContent(x), x => BindContentFile(x));
        if (results.Result1.Count > 0)
        {
            content = results.Result1[0];
            content.AttachRelatedItems(results.Result2);
            content.Files = results.Result3;
        }
    }
    return content;
}

BindContent和BindContentFile是用结果执行的函数。他们只是循环读者并建立集合。

这将调用一个通用的ExecuteReader方法,该方法处理来自过程的三个结果集:

private ThreeResults<T1, T2, T3> ExecuteReader<T1, T2, T3>(SqlCommand command, Func<SqlDataReader, T1> rowConverter1, Func<SqlDataReader, T2> rowConverter2, Func<SqlDataReader, T3> rowConverter3)
{
    ThreeResults<T1, T2, T3> resultsets = new ThreeResults<T1, T2, T3>();
    using (SqlConnection connection = new SqlConnection(this.ConnectionString))
    {
        command.Connection = connection;
        connection.Open();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            List<T1> ret1 = new List<T1>();
            List<T2> ret2 = new List<T2>();
            List<T3> ret3 = new List<T3>();
            while (reader.Read())
            {
                ret1.Add(rowConverter1(reader));
            }

            reader.NextResult();
            while (reader.Read())
            {
                ret2.Add(rowConverter2(reader));
            }

            reader.NextResult();
            while (reader.Read())
            {
                ret3.Add(rowConverter3(reader));
            }

            resultsets.Result1 = ret1;
            resultsets.Result2 = ret2;
            resultsets.Result3 = ret3;

            reader.Close();
        }
    }
    return resultsets;
}

1 个答案:

答案 0 :(得分:0)

对于应用程序的EF6部分,您可以使用内置的连接弹性来处理此https://msdn.microsoft.com/en-us/data/dn456835