Как же удолбут.
Тема "сессий" и "транзакций" при подключениях к различным базам данных судя по всему является очередным потаенным вуду для разработчиков. Причем даже для разработчиков самих БД и драйверов доступа к ним.
Иначе я не могу объяснить тот факт, что в некоторых серверах невозможно открыть одновременно две транзакции в одном соединении. Или то, что из трех ADO.NET провайдеров (Firebird, MSSQL, Postgresql) одновременно открыть два SQL запроса в одном соединении и читать одновременно из них - можно только в Firebird, два остальных ругаются типа "уже открыт DataReader".
Ну вот вопрос как в ADO.NET ленивым образом (не загружая в память) прочитать список сущностей из БД, и для каждой сущности прочитать вложенные для нее?
Ну всегда обычное решение было - цикл по одному DataReader, из него берем некое поле, подсовываем его значение в параметр второй команде, выполняем ExecuteReader и пытаемся читать во вложенном цикле. В Firebird работает, в других хрен.
PS: В Npgsql есть параметр PreloadReader=true, который позволяет обойти это ограничение и который не рекомендуется использовать, т.к. он грузит весь DataReader в память и смысл ленивой итерации теряется. И написано, что это ограничение - by design, упомянуто в доке на ADO.NET.
По моему, архитекторов ADO.NET надо убить, это же идиотизм клинический.
Иначе я не могу объяснить тот факт, что в некоторых серверах невозможно открыть одновременно две транзакции в одном соединении. Или то, что из трех ADO.NET провайдеров (Firebird, MSSQL, Postgresql) одновременно открыть два SQL запроса в одном соединении и читать одновременно из них - можно только в Firebird, два остальных ругаются типа "уже открыт DataReader".
Ну вот вопрос как в ADO.NET ленивым образом (не загружая в память) прочитать список сущностей из БД, и для каждой сущности прочитать вложенные для нее?
Ну всегда обычное решение было - цикл по одному DataReader, из него берем некое поле, подсовываем его значение в параметр второй команде, выполняем ExecuteReader и пытаемся читать во вложенном цикле. В Firebird работает, в других хрен.
PS: В Npgsql есть параметр PreloadReader=true, который позволяет обойти это ограничение и который не рекомендуется использовать, т.к. он грузит весь DataReader в память и смысл ленивой итерации теряется. И написано, что это ограничение - by design, упомянуто в доке на ADO.NET.
По моему, архитекторов ADO.NET надо убить, это же идиотизм клинический.
no subject
Интересно, почему оно не является поведением по умолчанию.
no subject
no subject
no subject
Но вот невозможность читать из двух SQL запросов одновременно - это какой-то бред тяжкий, имхо.
no subject
no subject
В API это выглядит как создание запроса, получение его хендла и затем использование этого хендла первым параметром во всех функциях(prepare, fetch, close).
no subject
no subject
no subject
Я вот вообще этим не запариваюсь. У меня JPA это все делает.
no subject
Попробуйте продумать алгоритм расчёта зарплат для 20 тыс.рабочих согласно белорусскому законодательству, желательно в пределах 3 часов. Могу примерно припомнить исходные таблицы:
- журналы рабочего времени по видам работ
- тарифы по видам работ
- таблица совместителей
- накопленные налоги по сотрудникам за последние 2 года
- справочник МРОТ по месяцам
- справочник налогов по месяцам
- справочник размеры пособий по уходу за ребенком
- выплаченные пособия за ребенком
- больничные листы
... где-то ещё штук 20 таблиц, забыл уже.
no subject
Это и называется быдлокодинг. Если программер работает на БД с 20 записями и верит, что 10 млн строк это то же самое.
Это называется вы не знаете чем, я занимаюсь :)
Попробуйте продумать алгоритм расчёта зарплат для 20 тыс.рабочих согласно белорусскому законодательству, желательно в пределах 3 часов.
Я вам могу встречную задачу по тарификации услуг доступа к сети предложить. Какое это имеет отношение к JPA и connection pool?
no subject
Вы всё еще не догадались???
Я намекаю, что программер должен не высасывать сразу все данные в память, а читать кусками; для этого и нужно понимание, какие соединения делают какие транзакции, вместо тупого использования connection pool.
Я вообще не понимаю, как можно в системах batch обработки использовать пулы. Поток вычисления-то один. Разве что тупо брать соединения, когда левая пятка в коде захочет?
no subject
Я намекаю, что программер должен не высасывать сразу все данные в память, а читать кусками; для этого и нужно понимание, какие соединения делают какие транзакции, вместо тупого использования connection pool.
Вы шо считаете меня идиотом да? Вообще в JPA для ограничения идиотов по умолчанию фетчится только первая 1000 строк. Да и я не фетчу 1000 строк при таких обновлениях.
Я вообще не понимаю, как можно в системах batch обработки использовать пулы. Поток вычисления-то один. Разве что тупо брать соединения, когда левая пятка в коде захочет?
В случае batch достаточно и одного подключения. Как бе у меня подразумевается обычно:
no subject
пул никак не связан со способом фетча данных.
можно читать результаты тяжелого запроса в одном подключении, дергать множество мелких - в другом. то же самое с несколькими транзакциями
Ребе, вероятно, смутило что ранее он использовал некое API, которое менеджило подключения к БД за него; с другой стороны все решается достаточно примитивным врэппером.
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
Проще уж на сервере все обработать тогда, ничего на клиента/миддлварь не вытаскивая.
no subject
no subject
Приемлемо ТОЛЬКО в случае, когда ну вообще никаких средств не осталось..
no subject
no subject
Другое дело что, судя по всему, ADO.NET это корректно делать не умеет, т.к. затачивалась под кривые сервера, коих большинство.
no subject
no subject
no subject
no subject
no subject
В принципе, Вы можете сами посмотреть доки по jtds проекту, там описываются протоколы, скорее всего фича корректно не получится.
no subject
Не вполне понимаю, что мешает открыть два соединения. Или сорок четыре, если требуется.
no subject
А вот два запроса в одной транзакции-соедиении - это что-то невменяемое.
no subject
no subject
no subject
Просто, насколько помню встречавшиеся мне варианты транзакции везде не имеют собственных хэндлов(следствие стандата SQL?) и тогда неясно, как указывть транзакцию для очередного выполняемого запроса.
no subject
no subject
no subject
Сессия это дорогой объект - новый коннект к базе данных тяжел. А транзакция поверх уже существующего коннекта дешевле.
no subject
no subject
no subject
Хуйнёй и вуду оно от этого быть не перестало.
no subject
ODBC uses as its basis the various Call Level Interface (CLI) specifications from the SQL Access Group, X/Open (now part of The Open Group), and the ISO/IEC.
1.0: released in September 1992[4]
The work with the Call Level Interface began in a subcommittee of the US-based SQL Access Group.
The SQL Access Group (SAG) was a group of software companies that was formed in 1989 to define and promote standards for database portability and interoperability. Initial members were Oracle Corporation, Informix, Ingres, DEC, Tandem, Sun and HP.
Так что слабал не микрософт.
no subject
1) Несколько параллельных транзакций в одном соединении не поддерживается, но есть SavePoint (которые поддерживаются некоторыми базами и позволяют делать, в частности, вложенные транзакции)
2) Параллельные ResultSet поддерживаются на одном коннекте (я не припомню проблем с параллельным разбором нескольких одновременно)