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

Может ли 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
Новые материалы

Как начать получать пассивный доход через блоги по программированию?
Получение пассивного дохода с помощью блогов по программированию — отличный способ пополнить свой доход и работать из дома. Существует много способов получения пассивного дохода от вашего..

Как ИИ меняет сельское хозяйство
Прочтите Статью Кэтлин Уолч в Forbes о том, как ИИ меняет сельское хозяйство . Сельское хозяйство и земледелие - одна из древнейших и важнейших профессий в мире. Человечество прошло долгий..

Slack: проектирование современных интерфейсов человека и ИИ
Когда Стюарт Баттерфилд выделил Slack из быстро исчезающей онлайн-игры Tiny Speck, его перспективы были в лучшем случае неопределенными. Существовал очевидный спрос на средства связи на рабочем..

HTTP1.1 против HTTP2
Http расшифровывается как HyperText Transfer Protocol, это в основном метод, который компьютеры и серверы используют для запроса и отправки информации. HTTP1.1 - это более старая версия Http, а..

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

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

Буферы протоколов, часть 01: соглашения об именах и файловая организация
Если вам нравится читать статьи на Medium и вы заинтересованы в том, чтобы стать участником, я буду рад поделиться с вами своей реферальной ссылкой!