Alla sessione WWDC 2013 '207: Novità in Core Data', si dice che è possibile abilitare SQLite WAL passando un dizionario di opzioni quando si aggiunge un negozio persistente:iOS CoreData - ci sono degli svantaggi nell'abilitare il logging WAL/Write-Ahead di sqlite
@{ NSSQLitePragmasOption: @"journal_mode = WAL" }
(che è disponibile su iOS4 + e sarà l'impostazione predefinita per le future versioni di iOS).
Mi chiedo se questo sarebbe in genere una buona cosa da abilitare nella mia app anche per le versioni precedenti di iOS.
Ho consultato i SQLite page about write ahead logging e gli svantaggi che menzionano, la maggior parte di loro sembrano non applicare a iOS a parte:
- WAL potrebbe essere molto leggermente più lento (forse 1% o 2% più lento) rispetto l'approccio di tipo rollback-journal tradizionale in applicazioni che funzionano principalmente su e raramente scrivono.
praticamente tutti i vantaggi suonano come se probabilmente sarà un beneficio su iOS:
- WAL è significativamente più veloce nella maggior parte degli scenari.
- WAL offre maggiore concorrenza in quanto i lettori non bloccano i writer e uno scrittore non blocca i lettori. La lettura e la scrittura possono procedere contemporaneamente.
- Le operazioni di I/O su disco tendono ad essere più sequenziali utilizzando WAL.
- WAL utilizza molte meno operazioni fsync() ed è quindi meno vulnerabile ai problemi nei sistemi in cui la chiamata di sistema fsync() è interrotta.
Sto pungendo (forse soggetto a fare alcuni controlli sulla mia app per assicurarsi che non rallenti) che questa sarebbe una buona cosa da abilitare, ma c'è qualche aspetto negativo che dovrei guardare per o eventuali problemi noti?
Devo notare che questo si verifica solo nelle migrazioni "avanzate", quando è necessario un gestore di migrazione. Migrazioni meno radicali (come l'aggiunta o la ridenominazione di una colonna) funzioneranno correttamente, poiché vengono eseguite sullo stesso database e non in una copia. – pgb
@pgb è bello sapere, grazie per il chiarimento! – JosephH
Non potresti disabilitare temporaneamente WAL, cancellando il journal (-wal file), e poi fai la migrazione ...? – CommaToast