Страницы

Поиск по вопросам

суббота, 6 июля 2019 г.

Запросы к базе данных MSSQL в высоконагруженном приложении

Хочу создать static class для работы с БД, содержащий методы для получения данных. Но дело в том, что обращения к методам класса могут происходить из разных потоков. Вопрос. Как поведет себя подобный класс при одновременном обращении к одному из методов из двух разных потоков? (Будет ли он ждать, пока завершится первый запрос, произойдет исключение или запрос будет выполнятся в другом потоке?) Точнее: Как правильно организовать запросы к БД осуществляя их из разных потоков?


Ответ

Заложить в подобной задаче статический класс, как фундамент работы с БД, означает отказаться от ООП и перейти к процедурному программированию, постепенно наращивая "мусорник", в лучшем случае разделенный на "хелпер" классы, "датасорсы" или еще чего. Более того, "контекст" БД обычно НЕ потокобезопасный, как и статика, и вам придется постоянно заботиться о синхронизации. Гораздо эффективней применить какую-либо ORM для работы с БД + (UnitOfWork + Repository + Specification). В данном подходе архитектура станет к тому же и тестируемой, чего не скажешь про сплошные статические классы и методы, протестировать которые можно только при помощи дополнительного кода в виде "врапперов". Для управления жизненным циклом объектов имеет смысл использовать один из существующих решений DI/IoC. Например в вашем случае можно на этапе настройки указать жизненный цикл для контекста БД "PerThread" и "контейнер" будет сам следить, чтобы в каждом потоке был свой, новый контекст или одна транзакция.

Комментариев нет:

Отправить комментарий