微软在过去几天发布了更新kb4088776,这对indexedDb openCursor的性能造成了破坏性影响。
这里简单的小提琴显示了问题。通过更新,“检索”时间为40秒或更长。在更新之前,它大概是1秒钟。
https://jsfiddle.net/L7q55ad6/23/
相关的检索部分在这里:
var _currentVer = 1;
function _openDatabase(fnSuccess) {
var _custDb = window.indexedDB.open("MyDatabase", _currentVer);
_custDb.onsuccess = function (event) {
var db = event.target.result;
fnSuccess(db);
}
_custDb.onerror = function (event) {
_custDb = null;
fnSuccess(null); // should use localData
}
_custDb.onupgradeneeded = function (event) {
var db = event.target.result;
var txn = event.target.transaction;
// Create an objectStore for this database
if (event.oldVersion < _currentVer) {
var customer = db.createObjectStore("customer", { keyPath: "guid" });
var index = customer.createIndex("by_id", "id", { unique: false });
}
};
}
function _retrieveCustomers(fn) {
_openDatabase(function (db) {
if (db == null)
{
alert("not supported");
return;
}
var customers = [];
var transaction = db.transaction("customer", "readonly");
var objectStore = transaction.objectStore("customer");
if (typeof objectStore.getAll === 'function') {
console.log("using getAll");
objectStore.getAll().onsuccess = function (event) {
fn(event.target.result);
};
}
else {
console.log("using openCursor");
objectStore.openCursor().onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
customers.push(cursor.value);
cursor.continue();
}
else {
fn(customers);
}
};
}
});
}
创建和添加客户的时间基本正常,只有检索不好。 Edge从未支持getAll方法,并且在更新后仍然不支持。
我能想到的唯一解决方法是使用localStorage,但遗憾的是我们的数据集太大而无法满足10MB的限制。现在从我们的服务器检索并将文本转换为javascript对象实际上更快,从而破坏了indexeddb的主要目的。
答案 0 :(得分:1)
我没有Edge所以我无法对此进行测试,但是它也会在get
或openCursor
时发生吗?如果get
仍然表现良好,您可以在localStorage中存储索引(在您的示例中,主键列表;在您的真实应用中,可能更复杂),然后使用它来调用get
每一个。