Работа с большими объёмами данных в IndexedDB требует минимизации количества транзакций и снижения накладных расходов на каждую отдельную операцию. Dexie.js предоставляет набор пакетных методов, позволяющих выполнять массовые вставки, обновления, чтение и удаление данных с высокой производительностью и предсказуемым поведением.
Пакетные операции реализованы как атомарные или полуатомарные транзакции (в зависимости от метода и параметров), что позволяет эффективно обрабатывать тысячи и десятки тысяч записей без значительной деградации производительности.
IndexedDB работает через транзакции, каждая из которых имеет фиксированный набор object store и ограниченное время жизни. Частые мелкие операции создают значительные накладные расходы: открытие транзакции, сериализация запросов, обработка событий успеха и ошибок.
Dexie.js оптимизирует этот процесс, объединяя множество операций в одну транзакцию и используя внутренние очереди запросов.
Ключевые принципы:
Метод bulkAdd() используется для массовой вставки новых
записей в таблицу. Он предназначен для сценариев первичного импорта
данных или добавления больших наборов уникальных объектов.
table.bulkAdd(items, keys?)
items — массив объектов для добавленияkeys — (опционально) массив ключей, если не
используется autoIncrementbulkAdd() строго ориентирован на добавление новых
записей:
Dexie позволяет получить подробную информацию о сбойных элементах:
try {
await db.users.bulkAdd(usersArray);
} catch (err) {
console.error(err.failures); // массив ошибок по элементам
}
Ошибки могут возникать из-за:
bulkAdd() значительно быстрее последовательных
add() благодаря:
Метод bulkPut() является более универсальным аналогом
bulkAdd(). Он выполняет вставку новых записей и обновление
существующих в рамках одной операции.
table.bulkPut(items, keys?)
bulkPut() выполняет upsert-операцию:
Это делает метод ключевым инструментом синхронизации данных.
Обычный put() работает с одной записью, тогда как
bulkPut():
При массовых операциях возможны частичные сбои:
try {
await db.products.bulkPut(products);
} catch (e) {
console.log(e.failures);
}
bulkPut() часто применяется при:
Метод bulkGet() позволяет извлекать несколько записей по
списку ключей за одну операцию.
table.bulkGet(keys)
keys — массив первичных ключейМетод возвращает массив, где:
undefinedconst users = await db.users.bulkGet([1, 2, 3]);
Результат:
[
{ id: 1, name: "A" },
undefined,
{ id: 3, name: "C" }
]
bulkGet() эффективнее множественных get()
благодаря:
Метод bulkDelete() предназначен для удаления множества
записей по ключам.
table.bulkDelete(keys)
Удаление выполняется максимально эффективно за счёт:
Ошибки могут возникнуть в редких случаях:
Dexie возвращает информацию о неудачных удалениях через исключения или структуру ошибок транзакции.
Все bulk-методы выполняются внутри IndexedDB транзакций. Dexie автоматически:
При работе с массивами в десятки тысяч элементов возникают особенности:
Рекомендуется учитывать:
| Метод | Назначение | Перезапись | Чтение | Удаление |
|---|---|---|---|---|
| bulkAdd | массовая вставка | нет | нет | нет |
| bulkPut | вставка + обновление | да | нет | нет |
| bulkGet | массовое чтение | — | да | нет |
| bulkDelete | массовое удаление | — | нет | да |
При использовании bulk-операций индексы обновляются автоматически:
Однако стоимость обновления индексов может существенно влиять на производительность при bulkPut больших объёмов данных.
Dexie поддерживает hooks (creating,
updating, deleting), которые также срабатывают
при bulk-операциях.
Особенности:
Массовая вставка без предварительной фильтрации часто приводит к конфликтам primary key.
Передача десятков тысяч объектов за один вызов может вызвать:
bulk-методы могут частично завершаться успешно, поэтому отсутствие
обработки failures приводит к неконсистентному состоянию
данных.
Пакетные методы Dexie.js формируют основу для высокопроизводительных offline-first приложений. Они позволяют:
Эти операции становятся критическим слоем между бизнес-логикой приложения и ограничениями браузерного хранилища.