IndexedDB写入超限时应捕获QuotaExceededError→评估空间压力→清理低优先级数据(如过期日志、低频缓存)→预检体积并退避重试(≤3次)→长期监控usage/quota比值,提前轮转缓存。

IndexedDB 写入超限(如 QuotaExceededError)通常发生在存储空间不足、单条记录过大或事务中写入数据过多时。浏览器不会自动清理旧数据,需主动干预——核心思路是:捕获错误 → 评估空间压力 → 清理非关键数据 → 重试写入。
识别并捕获 QuotaExceededError
该错误在 add()、put()、delete() 等操作的 onerror 或 Promise reject 中抛出,但注意它不是标准 DOMException,不同浏览器表现略有差异:
- Chrome / Edge:通常抛出
DOMException,name === "QuotaExceededError" - Firefox:可能抛出
DOMException或普通Error,需结合message判断(如含 "quota"、"storage") - 建议统一检查:
error.name === 'QuotaExceededError' || /quota|storage/i.test(error.message)
优先清理低优先级数据(按时间/使用频次)
避免直接清空库,而是按策略释放空间。常见安全清理方式:
- 按时间戳删除过期缓存:例如清理 7 天前的离线日志、临时上传分片
-
按访问频率降级:维护一个访问计数字段(如
lastUsed),删除lastUsed最早的 N 条 -
按数据类型分级:将 store 分为
cache、user_data、sync_queue,只允许清理cache和sync_queue中已成功同步的项
示例:清理 log_cache 中 3 天前的记录:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
立即学习“Java免费学习笔记(深入)”;
const now = Date.now();
const threeDaysAgo = now - 3 * 24 * 60 * 60 * 1000;
const transaction = db.transaction(['log_cache'], 'readwrite');
const store = transaction.objectStore('log_cache');
const range = IDBKeyRange.upperBound(threeDaysAgo, true);
store.delete(range);重试前做轻量预检与退避
清理后不立即重试,防止高频失败和资源争抢:
- 等待 100–300ms,让 IndexedDB 引擎完成清理事务提交
- 对当前待写入数据做体积估算(如
new TextEncoder().encode(JSON.stringify(data)).length),若 > 500KB,考虑分块或压缩 - 限制重试次数(建议 ≤ 3 次),超过则拒绝写入并通知用户“暂存失败,请稍后重试”
- 可搭配指数退避:
setTimeout(..., Math.min(100 * 2 ** retryCount, 2000))
长期优化:监控与预防性管理
仅靠错误后清理是被动方案。更健壮的做法包括:
- 定期(如每小时)调用
navigator.storage.estimate()获取usage和quota,当usage / quota > 0.8时提前触发缓存轮转 - 为每个 objectStore 设置合理上限(如日志不超过 10MB),写入前查 count + 预估大小
- 使用
indexeddb-get-all等工具辅助统计各 store 占用,便于定位膨胀源

















