Npgsql, пул подключений исчерпан

Я начал с этого - SemaphoreSlim для защиты пула соединений от истощения и быстро понял, что моя проблема в том, что соединения не возвращаются в пул, когда я удаляю DbContext.

Учтите, что все подключения к базе данных выполняются внутри оператора using, как такового:

using (var context = ContextFactory.GetContext<PostgreSqlDatabaseContext>(connectionString))
{
    var query = $"SELECT * FROM public.\"MyTable\" WHERE \"MyId\" = '{id}'";
    var result = await context.MyTable.FromSql(query).SingleOrDefaultAsync();
    return result;
}

ContextFactory выглядит так:

internal class ContextFactory
{
    public static T GetContext<T>(string sqlConnection) where T : DbContext
    {
        var optionsBuilder = new DbContextOptionsBuilder<PostgreSqlDatabaseContext>();
        optionsBuilder.UseNpgsql(sqlConnection);
        return new PostgreSqlDatabaseContext(optionsBuilder.Options) as T;
    }
}

Независимо от того, что я делаю со строкой подключения, устанавливая Enlist=true в соответствии с предложением здесь или регулируя соединения с использованием SemaphoreSlim в соответствии с предложением здесь, я получаю тот же результат:

The connection pool has been exhausted, either raise MaxPoolSize (currently 20) or Timeout (currently 15 seconds)

Npgsql вообще работает? Что здесь происходит?

Обратите внимание, что я прочитал это и это, и они не совпадают.

Соединения находятся возвращаются в пул при удалении контекста, если вы не открываете их отдельно и не оставляете открытыми. Создайте пример минимальный, который воспроизводит поведение без каких-либо фабрик, специального кода или даже необработанных SQL-запросов. Если вы хотите протестировать сам Npgsql, используйте простые классы ADO.NET, а не EF. Я подозреваю, что в обоих случаях вы обнаружите, что утечек нет. Если это произойдет, вы будете знать, что это остальной код кода, который держит вещи открытыми, когда этого не следует

Panagiotis Kanavos 21.03.2018 09:43

Кстати, имена классов и сущностей очень подозрительны. Предполагается, что контексты обрабатывают сущности. Они не являются соединениями, но PostgreSqlDatabaseContext предлагает использовать их как соединения. Вы пытаетесь выполнить необработанный запрос к набору сущностей Браузер (в единственном числе?), Но ищете другую таблицу по идентификатору. Если вы хотите загрузить браузер из набора Браузеры, вы можете написать context.Browsers.FindAsync(someID) для первичного ключа или context.Browsers.SingleOrDefaultAsync(b=>b.MyID==id).

Panagiotis Kanavos 21.03.2018 09:47
А также вы используете интерполяцию строк для создания динамических запросов. Что произойдет, если кто-то наберет '; Drop table Users;-- в качестве значения идентификатора?
Panagiotis Kanavos 21.03.2018 09:48

@PanagiotisKanavos - в ответ на «возвращается в пул при удалении контекста» контекст удаляется при закрытии оператора using. Какие потенциальные части этого примера вы видите, удерживая связи открытыми? И да - контексты должны обрабатывать entities, как мы пытались сделать изначально. Этот пример - результат разочарования из-за ошибки. Естественно, мы пробовали использовать EF, как он будет использоваться с MSSQL, но он просто не работает. Какой «меньший» пример я могу предоставить? : /

Marcus 21.03.2018 09:56

Один без какого-либо пользовательского кода ваш. Даже с SQL Server этот статический фабричный метод будет странный. Почему бы не указать подключение в конфигурация контекста? Одно соединение, заключенное в using, которое запускает одну команду, покажет исчерпание пула, если оно существует. Если вы повторите это внутри цикла 100 раз и не получите исчерпания пула, вы узнаете, что нет ошибки истощения.

Panagiotis Kanavos 21.03.2018 09:59

Как насчет предоставления простого, полного и минимального образца кода, воспроизводящего проблему? Таким образом мы сможем точно понять, что вы делаете.

Shay Rojansky 21.03.2018 10:19

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

Olivier MATROT 27.03.2018 16:36

@Marcus Я получаю то же самое _ я считаю, что USING неправильно закрывает соединения для Npgsql. На github есть вид болтовни вокруг этого. Но нет решения

ManInMoon 11.12.2018 16:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
8
7 151
0

Другие вопросы по теме