Реализую сервер который 24 на 7 будет работать с базой данных и должен постоянно обрабатывать запросы от всех пользователей, на всех примерах по работе с БД вижу что после выполнения запросов идет отключение от базы данных, соответственно вопрос: Обязательно ли при каждом запросе подключатся к базе данных? поскольку выходит что один запрос пользователя будет выглядеть как подключение, получение данных, отключение.
Можно ли реализовать подключение во время инициализации сервера и все время держать его открытым ?
Стек: C# Drapper + Postgre.
На всех примерах по работе с БД вижу что после выполнения запросов идет отключение от базы данных, соответственно вопрос: Обязательно ли при каждом запросе подключатся к базе данных? поскольку выходит что один запрос пользователя будет выглядеть как подключение, получение данных, отключение.
Да, обязательно. Дело в том, что в npgsql, как и почти во всех других клиентах для SQL в реализован механизм Connection Pooling.
NpgsqlConnection
- это не реальное сетевое соединение к базе. Это "одолженное" на время соединение из общего пула долгоживущих соединений.
Когда вы вызываете NpgsqlConnection.Open()
- этому экземпляру NpgsqlConnection
выделяется уже открытое соединение из пула. И только если в пуле свободных открытых соединений не оказалось - создается новое физическое соединение.
При вызове NpgsqlConnection.Close()/Dispose()
реальное соединение не закрывается, а просто возвращается в пул.
Поэтому самым эффективным по переиспользованию подключений является именно
using (var conn = new NpgsqlConnection(connectionString))
{
conn.Open(); // получение соединение из пула
...// получение данных
} // возврат соединения в пул
Т.к. чем быстрее вы отдадите соединение в пул - тем меньше шанс, что другому потоку соединений в пуле не хватит, и ему открывать реальное соединение при вызове Open
.
В рамках одного подключения нельзя реализовать одновременное выполнение запросов. Если у вас есть http запросы, которые долго выполняются то следует либо объединить несколько запросов к бд в один, либо оптимизировать сам запрос, либо масштабировать бд так, чтобы она выдерживала нагрузку.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Задача "Как сохранить порядок отображения подстрок"!