2012-05-04 12 views
5

Stiamo costruendo un'applicazione che fa ampio uso di IndexedDB su Firefox per archiviare dati offline.Errore "Operazione non riuscita perché non è stato possibile trovare l'oggetto del database richiesto ..." quando si utilizza indexedDB

Questo metodo funziona bene la maggior parte del tempo, ma di tanto in tanto riesce con errori come il seguente:

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)" 

Sembra di fallire in vari punti del codice; qui è uno dei colpevoli:

_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 

La cosa che enigmi me è che i fallimenti si verificano di rado, durante i test automatizzati che di solito lavorano (stiamo vedendo uno di questi fallimenti per centinaia di esecuzioni).

Vale la pena ricordare che stiamo archiviando anche molti dati, nell'ordine di centinaia di megabyte. Risulta che i test automatici memorizzano solo alcuni megabyte, quindi non è una questione di dimensioni.

Qualcun altro ha sperimentato (o meglio ancora, con esperienza e risolto!) Questo problema?

risposta

1

Questo sembra essere un bug di Firefox. Ho sollevato Bug 751802 - Intermittent IndexedDB write failures e i miei colleghi e io siamo impegnati a lavorare con gli utenti di Firefox per aiutare a riprodurlo.

Per ora non c'è soluzione o correzione.

0

Verificare se ci sono più schede aperte quando questo accade. Se uno di questi è in una setVersion (vecchia API) o nella onupgradedneeded (nuova API) probabilmente causerà problemi nell'altra.

Per eseguire il debug, assicurarsi di cercare gli eventi onblocked (rispetto a onerror) all'apertura del DB.

+0

Grazie - ma è successo in prod con una sola scheda in una singola istanza del browser. –

Problemi correlati