Geoduck
Geoduck

Reputation: 9003

Workaround for new Edge Indexeddb bug?

Microsoft released update kb4088776 in the past couple days, which has had a devastating effect on performance of indexedDb openCursor.

The simple fiddle here shows the problem. With the update, the "retrieval" time is 40 seconds or more. Prior to the update, it is around 1 second.

https://jsfiddle.net/L7q55ad6/23/

Relevant retrieval portion is here:

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);
        }
      };
    }
  });
}

enter image description here

The time to create and add the customers is basically normal, only the retrieval is bad. Edge has never supported the getAll method and it still doesn't after the update.

The only workaround I can think of would be to use localStorage instead, but unfortunately our data set is too large to fit into the 10MB limit. It is actually faster now to retrieve from our servers and convert the text to javascript objects, defeating the main purpose of indexeddb.

Upvotes: 1

Views: 878

Answers (1)

dumbmatter
dumbmatter

Reputation: 9673

I don't have Edge so I can't test this, but does it happen with get too, or just openCursor? If get still performs well, you could store an index (in your example, the list of primary keys; in your real app, maybe something more complicated) in localStorage, and then use that to call get on each one.

Upvotes: 1

Related Questions