В Dexie.js каждое соединение с базой данных представляет собой активный экземпляр обёртки над IndexedDB. Пока экземпляр открыт, браузер удерживает внутренние ресурсы: соединения, курсоры, кэш схемы и обработчики транзакций. Корректное закрытие становится критически важным в сценариях переключения контекста приложения, уничтожения модулей или перед удалением базы.
Закрытие выполняется через метод экземпляра:
db.close();
После вызова соединение переводится в неактивное состояние:
Особенность поведения заключается в том, что close() не
является асинхронным методом. Он не возвращает Promise и выполняется
синхронно с точки зрения API Dexie, хотя фактическое завершение операций
происходит на уровне браузера.
После закрытия экземпляр можно считать «пассивным». При этом:
open().db.close();
await db.open();
Повторное открытие приводит к повторной инициализации схемы, если это требуется, но без изменения версии базы.
Если во время вызова db.close() существуют активные
транзакции:
InvalidStateError при попытке
продолжить выполнение.Поэтому закрытие соединения логически корректно выполнять вне активных операций записи.
Удаление базы данных в Dexie.js выполняется на уровне всей IndexedDB-базы, а не отдельных таблиц. Это операция уничтожает:
Перед удалением необходимо гарантировать отсутствие активных подключений. IndexedDB блокирует удаление базы, если существуют открытые соединения.
Стандартный порядок:
db.close();
await Dexie.delete('myDatabase');
При несоблюдении этого порядка операция удаления может быть отклонена браузером или поставлена в очередь до освобождения блокировки.
Удаление выполняется через статический метод:
await Dexie.delete('myDatabase');
Метод возвращает Promise, который:
Перед удалением часто используется проверка:
const exists = await Dexie.exists('myDatabase');
Это позволяет избежать лишних операций, особенно в сценариях инициализации или сброса состояния приложения.
IndexedDB работает с моделью блокировок, где одновременно может существовать несколько соединений из разных вкладок браузера.
Dexie предоставляет механизм обработки ситуации, когда удаление или обновление базы невозможно из-за открытых соединений:
db.on('blocked', () => {
// обработка ситуации блокировки
});
Это событие возникает в случаях:
При удалении базы в одной вкладке:
Удаление и закрытие тесно связаны с системой версий IndexedDB.
При повышении версии базы Dexie автоматически инициирует процесс
versionchange, в ходе которого:
Если экземпляр не закрыт, может возникнуть блокировка:
db.on('versionchange', () => {
db.close();
});
При попытке открыть базу с новой версией в другом контексте:
Удаление базы во время активной работы требует строгого контроля состояния.
await db.transaction('rw', db.table, async () => {
// завершение логики
});
db.close();
await Dexie.delete('myDatabase');
Нарушение порядка приводит к:
После удаления база считается полностью уничтоженной. Повторное создание происходит как новая инициализация:
await Dexie.delete('myDatabase');
const db = new Dexie('myDatabase');
db.version(1).stores({
users: '++id,name'
});
await db.open();
Особенность заключается в том, что:
InvalidStateError Возникает при попытке работы с базой после закрытия.
DatabaseDeleteBlocked Появляется при активных соединениях в других вкладках.
QuotaExceededError (косвенно) Может проявляться после некорректного освобождения ресурсов и последующих операций записи.
try {
db.close();
await Dexie.delete('myDatabase');
} catch (e) {
console.error('Ошибка удаления базы', e);
}
Если попытаться открыть базу сразу после удаления:
await Dexie.delete('myDatabase');
await db.open();
поведение зависит от браузера:
Закрытие и удаление формируют полный цикл управления состоянием хранения данных:
open() создаёт активное соединение;close() завершает работу экземпляра;delete() уничтожает физическое хранилище.Системная логика Dexie строится вокруг того, что закрытие всегда предшествует удалению, а удаление всегда означает полное уничтожение состояния без возможности восстановления через API IndexedDB.