2012-10-31 3 views
5

Abbiamo una nuova versione beta del nostro software con alcune modifiche, ma non attorno al nostro livello di database.Appena iniziato a ricevere AIR SQLite Errore 3182 Errore I/O disco

Abbiamo appena iniziato a ricevere l'errore 3128 riportato nei log del nostro server. Sembra che una volta che succede, succede finché l'app è aperta. La parte del codice in cui è più evidente è dove registriamo i dati ogni secondo tramite SQLite. Solo questo mese abbiamo generato 47k errori sul nostro server.

3128  Disk I/O error occurred. Indicates that an operation could not be completed because of a disk I/O error. This can happen if the runtime is attempting to delete a temporary file and another program (such as a virus protection application) is holding a lock on the file. This can also happen if the runtime is attempting to write data to a file and the data can't be written. 

Non so cosa potrebbe causare questo errore. Forse un programma antivirus? Forse la nostra app si sta confondendo e scrivendo i dati uno sopra l'altro? Stiamo usando connessioni asincrone.

È causa di molti problemi e siamo in perdita. È successo nella nostra versione precedente, ma forse 100 volte in un mese anziché 47.000 volte. Ad ogni modo mi piacerebbe farlo accadere "0" volte.

risposta

0

La soluzione era quella di fare in modo di database cancellare, aggiornare, inserire successo solo uno alla volta al avvolgendo un piccolo involucro. Inoltre, abbiamo dovuto controllare l'errore 3128 e riprovare. Penso che questo sia dovuto al fatto che abbiamo un trigger in esecuzione che potrebbe bloccare il database dopo aver inserito i dati.

+0

cosa intendi avvolgere un piccolo involucro? – xiriusly

0

Possibile soluzione: Exception Message: Some kind of disk I/O error occurred

Sommario: Probabilmente non è un problema con il database, ma un problema di creare (o cancellare) il file temporaneo una volta che il database viene aperto. AIR può disporre delle autorizzazioni per il database, ma non per creare o eliminare file nella directory.

Una risposta che ha funzionato per me è quello di utilizzare l'istruzione PRAGMA per impostare il valore journal_mode a qualcosa di diverso DELETE. Lo fai emettendo una dichiarazione PRAGMA nello stesso modo in cui emetterebbe una dichiarazione di interrogazione.

PRAGMA journal_mode = OFF 

Purtroppo, se l'applicazione si blocca nel mezzo di una transazione quando è impostata la modalità di inserimento nel diario OFF, quindi il file di database molto probabilmente andare corrotto. .

http://www.sqlite.org/pragma.html#pragma_journal_mode