Хобрук: Ваш путь к мастерству в программировании

Может ли TCustomClientDataset применять обновления в пакетном режиме?

У меня есть DB Express TSimpleDataset, подключенный к базе данных Firebird. Я только что добавил несколько тысяч строк данных в набор данных, и теперь пришло время вызвать ApplyUpdates.

К сожалению, это приводит к нескольким тысячам обращений к базе данных, поскольку она пытается INSERT каждую строку по отдельности. Это немного разочаровывает. Мне бы очень хотелось, чтобы набор данных генерировал одну транзакцию с несколькими тысячами операторов INSERT и отправлял все сразу. Я мог бы настроить это сам, если бы мне пришлось, но сначала я хотел бы знать, есть ли для этого какой-либо метод, встроенный в набор данных или инфраструктуру DBX.

06.06.2011

  • ClientDataSets, а точнее DataSetProviders запускают транзакцию только в том случае, если уже нет открытой транзакции (.SqlConnection.BeginTransaction). Однако я немного смущен, я думал, что «ApplyUpdates» запустил только «одну» транзакцию. 06.06.2011
  • @Sertac: Не уверен ни в чем из этого - я не слишком много в этом разбирался - но я знаю, что если я просто вызову ApplyUpdates, он в конечном итоге отправит каждый оператор INSERT по отдельности, что добавляет массу накладных расходов и замедляет работу. сильно вниз. Я в основном пытаюсь получить здесь объемную вставку. 06.06.2011
  • Хорошо, тогда это не связано с транзакциями. Насколько я могу отследить, в конечном счете, «UpdateTree» «CustomResolver» «DataSetProvider» проходит через «Delta», генерируя оператор для каждой записи. выхода из этого не вижу.. 06.06.2011

Ответы:


1

Не знаю, возможно ли это с TSimpleDataset (никогда не использовал его), но, безусловно, вы можете, если используете TClientDataset + TDatasetProvider + ‹поместите сюда свой набор данных db›. Вы можете написать BeforeUpdateRecord, чтобы самостоятельно обрабатывать процесс применения. По сути, это позволяет вам обойти стандартный процесс применения, получить доступ к набору данных delta с изменениями, внесенными в записи, а затем использовать собственный код и компоненты для применения изменений к базе данных. Например, вы можете вызывать хранимые процедуры для изменения данных и так далее.

Однако есть разница между транзакцией и тем, что называется "массив DML", "массовая вставка" и т.п. Даже если вы используете одну транзакцию (и «применить» AFAIK происходит в одной транзакции), внутри транзакции вам все равно может потребоваться отправить «n» INSERT. Некоторые базы данных поддерживают способ отправки одного INSERT (или обновления, удаления) с массивом вставляемых параметров, уменьшая количество используемых отдельных операторов, но это может быть очень специфичным для базы данных, и AFAIK dbExpress/Datasnap не поддерживает это - вы все еще можете использовать событие BeforeUpdateRecord, чтобы воспользоваться преимуществами определенных возможностей базы данных.

07.06.2011
Новые материалы

Дрейф концепций в ИИ
Что такое концептуальный дрейф? Дрейф понятий — это явление в искусственном интеллекте и машинном обучении, при котором основное распределение данных меняется со временем. Это изменение в..

Изучите Vue перед React. Вот почему
Сегодняшняя сеть представляет собой запутанный беспорядок из разных языков, библиотек и фреймворков, и начинающие веб-разработчики часто не могут понять, что изучать в первую очередь. Что вы..

Гл.31 — Помощь слабослышащим с помощью возможностей машинного обучения Apple Watch.
1 500 000 000  – количество людей с потерей слуха в мире. Это почти 20% населения Земли! (источник: who.int ) Недавно я экспериментировал с Apple Sound Classification API, и результаты на..

Машинное обучение без кода / Глубокое обучение Каждый специалист по обработке и анализу данных должен знать
Akkio, Очевидно.ай, DataRobot, Левити, Clarifai, Teachable Machines, Lobe, Pimer, DynaBench, APAflow Teachable Machine- https://teachablemachine.withgoogle.com/ Vertex AI..

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

Эта модель Google сочетает в себе рассуждение и действие в рамках одной языковой модели.
ReAct предоставляет архитектуру, которая инициирует действия на основе путей рассуждений языка. Недавно я запустил образовательный информационный бюллетень, посвященный ИИ, у которого уже..

Сортировка структур JSON по нескольким полям в JavaScript
Array.sort() не для слабонервных. Особенно, когда речь идет о сортировке сложных структур данных. Большинство руководств по JavaScript дают только краткое введение в Array.sort() . Обычно..