2016-04-14 43 views
0

Yaklaşık 10 - 20 bağlantıyla (sp_who2 aracılığıyla) sorunsuzca çalışan çok yoğun bir uygulama var, ancak bazen bağlantılar başlayacak (300 - 500) ve Azure Sql Veritabanı sonlandırmaya başlayacak onlar. Bu uygulamayı öldürür. Çok seyrek oldu, ama şimdi üçüncü uygulamayı ekledik.Azure Sql veritabanlarında sızıntı bağlantısını algıla

Şu anda veritabanına isabet eden 4 farklı uygulama var - bir yönetim sitesi ve uygulamanın üç farklı örneği.

Sql Server Profiler olmadan, sızıntının nereden geldiğini nasıl belirler?

Bir kenara göre, uygulama öncelikle Entity Framework 6'yı kullanır, ancak daha karmaşık/yoğun olarak kullanılan veri erişim yöntemlerinden bazıları bazı özel saklı yordamları ve ado.net kodunu kullanır. İşte bu potansiyel sorun olup olmadığını belirleyebilir durumda herkes, bir örnek:

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 ve BindContentFile sonuçları ile yürütülen fonksiyonlar bulunmaktadır. Sadece okuyucuyu çeviriyor ve koleksiyonunu oluşturuyorlar.

Bu prosedür üç resultsets işleyen bir jenerik ExecuteReader yöntemini çağırır: Uygulamanın Ef6'yı parçalar için

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; 
} 

cevap