Существует ли внутреннее ограничение, которое не позволяет Npgsql предоставлять несколько одновременных читателей при доступе к PostgreSQL из .NET? - PullRequest
0 голосов
/ 30 октября 2019

Существует ряд интернет-источников (Stackoverflow или других), указывающих, что Npgsql не поддерживает MARS (несколько активных считывателей), как это поддерживается SQLServer. Это внутреннее ограничение PostgreSQL? Или это больше связано с дизайном Npgsql?
Другими словами, можно ли решить эту проблему, добавив эту функцию в Npgsql, или это усилие обречено на провал? (Я знаю, что сообщество PostgreSQL приводит убедительные аргументы в пользу того, что «зачем вообще такая вещь нужна, PostgreSQL позволяет лучше формулировать операторы SQL, чтобы полностью устранить необходимость». Давайте просто скажем, что речь идет об уходе за системами. с десятками тысяч существующих операторов SQL, и переписывать их один за другим, очевидно, не вариант)

1 Ответ

2 голосов
/ 30 октября 2019

Реальный вопрос заключается в том, что происходит внутри системы для поддержки такой функции, как MARS.

На проводном уровне связь между Npgsql и PostgreSQL чрезвычайно проста: есть один сокет TCP, Npgsql отправляет запрос PGи PG отвечает всем набором результатов для этого запроса - одиночным циклом.

Различные модели для MARS заставляют Npgsql извлекать X строк каждый раз вместо получения полного результата;Npgsql будет буферизовать X строк в памяти и выполнять новую передачу туда и обратно, когда пользователь использует эти строки. Это позволило бы использовать MARS, но за счет введения большого количества новых сетевых циклов для каждого отдельного запроса: вместо одной циклической обработки теперь у вас есть N циклических циклов, где N - это число строк, разделенное на X. ,Кроме того, для буферизации строк используются дополнительные ресурсы памяти.

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

Таким образом, MARS определенно возможен, вопрос в том, как он реализован и какую цену вы за него платите. Время от времени я получаю этот запрос от разработчиков, портирующих код с SQL Server, но, если честно, люди просто не просили его много.

PS Обратите внимание, что этот последний вариант может стать более актуальным с некоторыми изменениями перфектов, которые мы изучаем для следующей основной версии. Но пока не уверен.

...