Сервер базы данных слишком занят. Нужны советы по открытию DataContexts - PullRequest
2 голосов
/ 03 августа 2011

У меня эта огромная система запустилась вчера. Тысячи людей соединяются одновременно .. Я использую SQL Server 2008 и .NET 3.5 (C #);

Сегодня я заметил, что мой db-сервер работает очень медленно (кстати, серверный компьютер действительно, действительно способен с легкостью справиться с этим приложением, как в 10 раз, поэтому я, должно быть, испортил свои соединения или что-то в этом роде).

Прежде всего: мои бизнес-классы создают только один DataContext каждый. На уровне класса, вот так:

public class BusProduct : IDisposable
{
    //DataContext
    DBDataContext db = new DBDataContext();


    //Variable of type DAL.Products (that will be set on application level)
    public Products _attributes { get; set; }

    //Dispose
    public void Dispose()
    {
        Dispose(true);

        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
    }

    /// Constructor
    public BusProduct()
    {
        try
        {
            //New object
            _attributes = new Product();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message,ex);
        }
    }

    public void Insert()
    {
        try
        {
            //Insert data set on _attributes
            db.Products.InsertOnSubmit(_attributes);
            db.SubmitChanges();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message,ex);
        }

    }

}

Что вы, ребята, думаете об этом (один DataContext на класс)? Что ты предлагаешь? Это хорошо для огромных классов? Это даже хорошо?

Мне нравится делать это в основном из-за возвратов типа IQueryable<Type>. (При попытке получить доступ к этому виду возврата, если я использую один DataContext для каждого метода, он уже будет удален)

1 Ответ

5 голосов
/ 03 августа 2011

Что вы, ребята, думаете об этом (один DataContext на класс)?

То, что вы делаете, неправильно на многих уровнях, это не весело - например, как вы синхронизируете обновления для нескольких классов в транзакции? Распределенная транзакция на 200 обновлений ПРОСТО, потому что вас не интересует правильная обработка соединений? Это очень дорого Как вы работаете с объединениями и проектами между несколькими классами? Вы заставляете разные контексты данных (по одному на класс), что приведет к полной неспособности базового провайдера оптимизировать - не то чтобы это технически невозможно, но я уверен, что разработчик просто скажет вам правильно подать в суд на вопрос, почему не позаботится об этом.

Для разумного подхода потребуется полное переписывание: откройте соединение при запуске страницы, закройте его при завершении страницы. Ну, иногда больше, чем одна, если вам нужны отдельные транзакции базы данных, но обычно - нет.

Плюс получите одну из этих книг для начинающих, рассказывающую о шаблоне хранилища. Мы запускаем все базы данных через DataManager.

DataManager содержит соединение, реализует такие вещи, как Entity, который является IQueryable. Откройте один в начале, используйте его по мере необходимости, закончил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...