Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 105
1
PostgreSQL

Несколько одновременно открытых запросов в одном соединении к PostgreSQL

07.06.2023, 17:56. Показов 2060. Ответов 10

Author24 — интернет-сервис помощи студентам
Доброго времени,

такая проблема , открыт один NpgsqlDataReader, когда открываю следующий в этом же
соединении - то ругается : Npgsql.NpgsqlOperationInProgressException: "A command is already in progress:
и указывает на запрос предыдущего открытого NpgsqlDataReader.

Подскажите , есть ли настройки, чтобы можно было одновременно открывать несколько запросов?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2023, 17:56
Ответы с готовыми решениями:

Добавление данных в Postgresql, Несколько запросов в одном событии
Здравствуйте! Подскажите пожалуйста в чем может быть беда ? Первый запрос выполняется,...

Выполнение одновременно несколько sql запросов одновременно
Здравствуйте. Есть проблема! Пролистал много сайтов и форумов и толком ничего не нашел. Суть...

Как одновременно сохранить несколько открытых документов?
Добрый день! Столкнулась с такой проблемой: при закрытии на рабочем столе порядка 20 документов...

MS Excel 2013 - несколько открытых файлов в одном окне
В MS Excel 2010 при открытии нескольких документов они открывались в одном окне на вкладках, в 2013...

10
Администратор
Эксперт .NET
17567 / 13789 / 5299
Регистрация: 17.03.2014
Сообщений: 28,270
Записей в блоге: 1
07.06.2023, 21:38 2
Леонид_М, нужно закрыть первый NpgsqlDataReader перед открытием второго. Самое правильное через блок using.
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 105
08.06.2023, 09:27  [ТС] 3
OwenGlendower,

это я знаю, что можно закрыть... У меня вопрос: как сделать, чтобы открыть несколько запросов одновременно в одной сессии?
Возможно ли такое в Postgresql?
0
Администратор
Эксперт .NET
17567 / 13789 / 5299
Регистрация: 17.03.2014
Сообщений: 28,270
Записей в блоге: 1
08.06.2023, 09:43 4
Леонид_М, похоже такой режим не поддерживается. Нашел issue на GitHub созданное еще в 2015 году - Implement MARS (Multiple Active Result Set). Там предлагается открывать новое соединение или использовать курсоры (что может быть медленным).
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 105
08.06.2023, 10:07  [ТС] 5
OwenGlendower,

так с 2015-го могло все измениться... Я ничего толкового по этому вопросу не нашел,
кроме как одного упоминания ,что чтобы открыть новый запрос нужно закрыть старый.
Но опять же - это было не за последний год, а лет 12 назад вот это:

Я думаю, ты не сможешь. Одно соединение может одновременно обрабатывать один запрос.
Это описано в главе «Асинхронная обработка команд» документации libpq:
«После успешного вызова PQsendQuery вызовите PQgetResult один или несколько
раз для получения результатов. PQsendQuery не может быть вызван снова (в том же соединении),
пока PQgetResult не вернет нулевой указатель, указывающий, что команда выполнена».

Странно, что эта тема не обсуждалась...
0
Администратор
Эксперт .NET
17567 / 13789 / 5299
Регистрация: 17.03.2014
Сообщений: 28,270
Записей в блоге: 1
08.06.2023, 10:16 6
Леонид_М, про 2015 я упомянул только чтобы показать что идея давно была предложена. В issue шло довольно активное обсуждение, которое стоит прочитать, раз вас интересует данная тема. Плюс там есть ссылки на другие issue. Их тоже не помешает проглядеть. В рамках уже упомянутого issue #462 вот самый важный комментарий от ведущего разработчика на проекте:
Here are some notes on MARS and why I'm not sure it belongs in Npgsql. tl;dr unlike SQL Server, PostgreSQL simply doesn't have a mechanism that would allow an efficient MARS implementation.

One aspect of MARS is to make it easier for users to write ADO.NET code: users can execute multiple commands without caring or tracking if the connection is already in use. This is purely a convenience thing - it's always possible to rewrite code so that it either (a) uses separate connections, (b) buffers the entire resultset before execute another command, or (c) uses PostgreSQL cursors and explicitly fetching results for the different commands.

Beyond convenience, another aspect of MARS is performance. To the best of my understanding, when using MARS on SQL Server, the multiple resultsets are streamed back from the server without any additional roundtrips being made by the client, as is required when using PostgreSQL cursors (e.g. FETCH NEXT). Considering the perf importance of roundtrips, this difference is really essential - an application doing MARS on SQL Server isn't doing any additional roundtrips, whereas a cursor-based MARS against PostgreSQL would be adding a lot of roundtrips. However, if users do want this behavior on Npgsql, they can use cursors themselves and accept the extra roundtrips.

The same is true if MARS is implemented by buffering the entire resultset - users can do it themselves if they wish, but that has a potentially large cost in terms of memory usage.

To summarize, given that PostgreSQL itself doesn't have an efficient MARS implementation (AFAIK), it doesn't seem right for Npgsql to implicitly do MARS under the hood, with considerable perf costs that would be implicit - unsuspecting users would be falling into a perf pit of failure.
0
Эксперт .NET
12504 / 8688 / 1310
Регистрация: 21.01.2016
Сообщений: 32,637
08.06.2023, 12:40 7
Леонид_М, можешь в двух словах объяснить зачем такое понадобилось?
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 105
08.06.2023, 13:51  [ТС] 8
Usaga

есть проект на mssql, там такое встречается, мне его нужно переделать на PostgreSQL.

OwenGlendower,

нашел пару предложений как должно работать - в строку коннекта добавить MultipleActiveResultSets = true или
preload reader=true - но не помогло ,пишет ,что неизвестные параметры...
0
Эксперт .NET
12504 / 8688 / 1310
Регистрация: 21.01.2016
Сообщений: 32,637
08.06.2023, 14:00 9
Цитата Сообщение от Леонид_М Посмотреть сообщение
MultipleActiveResultSets = true
Такое понимает только MS SQL. Так зачем такое понадобилось?
0
Администратор
Эксперт .NET
17567 / 13789 / 5299
Регистрация: 17.03.2014
Сообщений: 28,270
Записей в блоге: 1
08.06.2023, 14:01 10
Цитата Сообщение от Леонид_М Посмотреть сообщение
в строку коннекта добавить MultipleActiveResultSets = true
Это работает только для SQL Server.

Цитата Сообщение от Леонид_М Посмотреть сообщение
preload reader=true
Этот параметр убрали в версии 3.0 - Npgsql 3.0 Release Notes. Там же дана ссылка на issue 462 с комментарием "We plan on working on MARS support". Очевидно эти планы все еще не воплощены в жизнь.

Цитата Сообщение от Леонид_М Посмотреть сообщение
есть проект на mssql, там такое встречается, мне его нужно переделать на PostgreSQL.
Видимо придется переписывать без использования MARS.
1
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 105
08.06.2023, 15:05  [ТС] 11
OwenGlendower

Видимо придется переписывать без использования MARS. - Да... печалька!...

Спасибо!
0
08.06.2023, 15:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2023, 15:05
Помогаю со студенческими работами здесь

MySqlConnection, несколько запросов одновременно
В общем написал вот такой класс для сервера, заметил что если не освободить ресурсы то...

Несколько запросов в одном
Как можно добавить в одну таблицу строку и сразу же обновить строку в другой таблице, передав...

Несколько запросов в одном
Можно ли сделать несколько запросов в одном? Например вот есть 2 таблицы и более с одинаковыми...

Как запустить несколько AJAX запросов одновременно
В общем есть массив arLatLong с координатами GPS, размер массива первоначально не определён, может...

Несколько запросов в одном событии
Доброго здоровья всем. Есть нужно выполнить сразу несколько SQL-запросов при нажатии кнопки. Суть:...

Может ли один обработчик принимать несколько запросов одновременно?
Задача примерно такая: Есть сервер удаленный. На нем лежат php обработчики приложения. Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru