Я работаю на очень большом веб-сайте электронной торговли с высоким трафиком. Мы переносим наш сайт с ColdFusion на .NET. Мы недавно столкнулись с проблемой во время этого преобразования, о котором я надеялся немного помочь. Наш текущий сайт составляет около 1/3 .net сейчас и 2/3 ColdFusion.. Сбой веб-сайта .NET
Одна из проблем заключается в том, что при выпуске нашего последнего проекта, который представляет собой проект для преобразования раздела «Моя учетная запись», все отлично, но в любом месте от 3 до 24 часов сайт просто падает. Чтобы восстановить его, нам необходимо перезапустить IIS, а иногда ColdFusion. Когда я говорю о сбоях, я имею в виду, что он просто висит, сидит там и вращается навсегда.
У нас действительно хороший мониторинг серверов, но когда мы смотрим на память служб, ничего необычного не наблюдается, за исключением количества подключений к SQL. По какой-то причине довольно быстро, прежде чем крах SQL застревает в количестве подключений, он идет примерно из 24 подключений примерно до 100, просто сидит там, и сайт идет вниз, пока мы не перезапустим службы.
В настоящее время мы используем SQL Server 2005, инфраструктуру Entity как наш метод доступа к данным, и мы находимся на IIS 7.5. Наш веб-сервер является виртуальным, но наша база данных является физической.
У нас было много людей из нашей команды, которые прошли через весь код в этом новом проекте, чтобы подтвердить, что у них не было соединений, которые были оставлены открытыми, поскольку на основе проблем с соединениями, вроде как кажется. Мы не могли найти никаких связей, открытых открытым, а не одного.
Это пример нашего текущего доступа к данным объекта:
/// <summary>
/// Get Products by their Primary Category ID. Default Category ID is 0: Top Level Categories.
/// </summary>
/// <param name="languageCode">Two character language code of Categories being searched. Defined in dbo.Languages, LanguageCode field.</param>
/// <param name="primaryCategoryId">int - Primary Category ID</param>
/// <returns>List<Product%gt;</returns>
public List<Products.Product> GetProducts(string languageCode, int primaryCategoryId = 0)
{
CatalogEntity context = null;
EntityConnection conn = null;
try
{
conn = this.GetConnection();
context = new CatalogEntity(conn);
List<I_Products> Products = context.GetProductsByPrimaryCatId(primaryCategoryId, languageCode).Distinct().ToList();
return Products.Select(Product => new Products.Product(Product)).Distinct().ToList();
}
catch (System.Exception ex)
{
string message = "Error occurred while calling GetProducts.";
throw new Exception.CatalogDataException(message, CodeLibrary.Core.Helpers.ProcessHelper.GetProcessName(this), ex);
}
finally
{
if (conn != null && conn.State == ConnectionState.Open) conn.Close();
if (context != null) context.Dispose();
conn.Dispose();
}
}
Опять же, это только один пример одного из наших методов доступа к данным в C#. Не видишь никаких проблем с этим? Опять же, мы используем этот формат по всем направлениям. Мы это подтвердили.
С новым проектом .net мы используем провайдер членства .net. Мы используем CLR для шифрования паролей пользователей с хешем, чтобы мы могли использовать один и тот же метод хеширования в CF. Не уверен, что это проблема, но подумал, что стоит упомянуть.
Любые идеи?
Тот факт, что количество сбоев SQL-пакетов падает до сбоев, указывает на проблему с базой данных. Может быть, это тупик или тайм-аут в SQL Server? – recursive
Наверное, выясните, что делает каждое из этих новых подключений SQL (какие запросы выполняются), которые могут пролить свет на то, почему они создаются. –
Мы пропустили профайлер SQL до и во время одной из этих сбоев и не видели ничего, что выглядело бы из нормы. – user3320043