使用indexedDB时出现错误“操作失败,因为无法找到所请求的数据库对象...”

时间:2012-05-04 02:26:30

标签: html5 firefox indexeddb

我们正在构建一个在Firefox上广泛使用IndexedDB来存储离线数据的应用程序。

这在大多数情况下运行良好,但偶尔会因以下错误而失败:

Exception... "The operation failed because the requested database object could 
not be found. For example, an object store did not exist but was being opened."  
code: "3" nsresult: "0x80660003 (NS_ERROR_DOM_INDEXEDDB_NOT_FOUND_ERR)"

它似乎在代码的各个地方都失败了;这是罪魁祸首之一:

_writePage: (storeName, startIndex, endIndex, binder) ->
  writeTransaction = @connection.transaction([storeName], @idbTransaction.READ_WRITE)
  store = writeTransaction.objectStore(storeName)
  for index in [startIndex...endIndex] when (item = binder.list[index])?
    writeRequest = store.put(item)
    writeRequest.onerror = binder.failCallback()
    writeRequest.onsuccess = binder.successCallback()
  if endIndex >= binder.list.length
    binder.finishedRegisteringCallbacks()
    return
  setTimeout((=> @_writePage(storeName, endIndex, endIndex + @WRITE_EACH_PAGE_SIZE, binder)), @WRITE_EACH_PAGE_DELAY)
  null

令我感到困惑的是,在通常有效的自动化测试中,故障很少发生(我们每次执行数百次都会看到其中一次失败)。

值得一提的是,我们也存储了大量数据,大约数百兆字节。原来自动化测试只存储了几兆字节,所以这不是一个大小问题。

有没有其他人经历过这种问题(或者更好,有经验并且已经修复过!)?

3 个答案:

答案 0 :(得分:2)

这似乎是一个Firefox错误。我已经提出了Bug 751802 - Intermittent IndexedDB write failures,我和我的同事正在忙着与Firefox人员一起帮助重现它。

暂时没有解决方法或修复方法。

答案 1 :(得分:0)

检查发生这种情况时是否打开多个标签页。如果其中一个位于setVersion(旧API)或onupgradedneeded(新API)中,则可能会导致另一个问题。

要进行调试,请确保在打开数据库时查找onblocked(与onerror)事件。

答案 2 :(得分:0)

添加到@Duncan的回答:

在该线程上,可以在db creation / open

中抛出一个catch

https://bugzilla.mozilla.org/show_bug.cgi?id=751802#ch-8