Подключение к базе данных из сервера

108
27 июня 2021, 09:50

Реализую сервер который 24 на 7 будет работать с базой данных и должен постоянно обрабатывать запросы от всех пользователей, на всех примерах по работе с БД вижу что после выполнения запросов идет отключение от базы данных, соответственно вопрос: Обязательно ли при каждом запросе подключатся к базе данных? поскольку выходит что один запрос пользователя будет выглядеть как подключение, получение данных, отключение.

Можно ли реализовать подключение во время инициализации сервера и все время держать его открытым ?

Стек: C# Drapper + Postgre.

Answer 1

На всех примерах по работе с БД вижу что после выполнения запросов идет отключение от базы данных, соответственно вопрос: Обязательно ли при каждом запросе подключатся к базе данных? поскольку выходит что один запрос пользователя будет выглядеть как подключение, получение данных, отключение.

Да, обязательно. Дело в том, что в npgsql, как и почти во всех других клиентах для SQL в реализован механизм Connection Pooling.

NpgsqlConnection - это не реальное сетевое соединение к базе. Это "одолженное" на время соединение из общего пула долгоживущих соединений.

Когда вы вызываете NpgsqlConnection.Open() - этому экземпляру NpgsqlConnection выделяется уже открытое соединение из пула. И только если в пуле свободных открытых соединений не оказалось - создается новое физическое соединение.

При вызове NpgsqlConnection.Close()/Dispose() реальное соединение не закрывается, а просто возвращается в пул.

Поэтому самым эффективным по переиспользованию подключений является именно

using (var conn = new NpgsqlConnection(connectionString))
{
    conn.Open(); // получение соединение из пула
    ...// получение данных
}   // возврат соединения в пул

Т.к. чем быстрее вы отдадите соединение в пул - тем меньше шанс, что другому потоку соединений в пуле не хватит, и ему открывать реальное соединение при вызове Open.

Answer 2

В рамках одного подключения нельзя реализовать одновременное выполнение запросов. Если у вас есть http запросы, которые долго выполняются то следует либо объединить несколько запросов к бд в один, либо оптимизировать сам запрос, либо масштабировать бд так, чтобы она выдерживала нагрузку.