【发布时间】:2015-03-21 18:28:24
【问题描述】:
我不知道我做错了什么,或者我只是在努力。
我正在尝试将 ~70000 条记录从我的在线数据库同步到 IndexedDB 以及 EventSource 和 Worker。
所以我每个包有 2000 条记录,然后使用以下代码将它们存储在 IndexedDB 中:
eventSource.addEventListener('package', function(e) {
var data = JSON.parse(e.data);
putData(data.type, data.records);
});
function putData(storeName, data) {
var store = db.transaction([storeName], 'readwrite').objectStore(storeName);
return new Promise(function(resolve, reject) {
putRecord(data, store, 0);
store.transaction.oncomplete = resolve;
store.transaction.onerror = reject;
});
}
function putRecord(data, store, recordIndex) {
if(recordIndex < data.length){
var req = store.put(data[recordIndex]);
req.onsuccess = function(e) {
recordIndex += 1;
putRecord(data, store, recordIndex);
};
req.onerror = function() {
self.postMessage(this.error.name);
recordIndex += 1;
putRecord(data, store, recordIndex);
};
}
}
这一切都适用于大约 10000 条记录。虽然没有真正测试限制在哪里。我怀疑在某些时候并行事务太多,这会导致单个事务非常慢,从而由于超时而引起麻烦。根据开发工具,70000 条记录大约是 20MB。
完全错误:
未捕获的 TransactionInactiveError:无法执行“放置” 'IDBObjectStore': 事务已完成。
有什么想法吗?
【问题讨论】:
-
There is some weirdness in the relationship between promises and IDB transactions 这可能是相关的。如果你摆脱了承诺,它会更好地工作吗?
-
每个包裹产生新的工人是一个可能的解决方案吗?
-
尽量不要使用承诺。
-
不幸的是完全一样,没有承诺
-
你用的是什么浏览器?同样的事情发生在所有人身上吗?也许您应该将此作为错误报告提交。以我的经验,Firefox 和 Chrome 的开发者对 IndexedDB 的 bug 都非常敏感。您还可以通过此邮件列表联系 Chrome IndexedDB 开发人员:groups.google.com/a/chromium.org/forum/#!forum/chromium-html5
标签: javascript cordova indexeddb