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;
}
Veritabanı yeniden bağlanmayı reddettiğinde bağlantı denemenin işe yaramayacağını düşünüyorum. – ScottE