It might be helpful to link the docs for some of these configs in the section where you mention them. Some thoughts:<p>Based on <a href="https://www.sqlite.org/wal.html" rel="nofollow">https://www.sqlite.org/wal.html</a> it seems the WAL index is mmapped as a workaround to some edge cases not relevant to many application developers. They say it shouldn’t matter, but with the larger page sizes you’re using, using the original implementation approach they describe (volatile shared memory) actually might improve performance slightly - do you know if your WAL index ever exceeds 32KiB? Not sure as to the difficulty of resurrecting that old functionality though.<p>Also, this case seems like something that could happen from time to time depending on what you’re doing. Did you encounter it? Case:<p>> When the last connection to a particular database is closing, that connection will acquire an exclusive lock for a short time while it cleans up the WAL and shared-memory files. If a second database tries to open and query the database while the first connection is still in the middle of its cleanup process, the second connection might get an SQLITE_BUSY error.<p>Both the WAL docs and the article mention blocking checkpointing/a need for reader gaps to ensure the WAL flushes, or a possibility that WAL files will grow indefinitely. I had some speculation that this was an implementation limitation, and it turns out another comment mentions WAL2 may relax this requirement by using two WAL files split between “hot” and “cold”. Curious how the performance might compare with this: <a href="https://sqlite.org/cgi/src/doc/wal2/doc/wal2.md" rel="nofollow">https://sqlite.org/cgi/src/doc/wal2/doc/wal2.md</a>