[odb-users] Regarding Sqlite WAL model support in ODB

Boris Kolpackov boris at codesynthesis.com
Tue Feb 2 09:15:14 EST 2016


Hi Steve,

Steve Chen <steve.chen at ringcentral.com> writes:

> m_db = std::shared_ptr<odb::sqlite::database>(
>  new odb::sqlite::database(
>    dbFile, 
>    SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_WAL));

I don't think the SQLITE_OPEN_WAL flag is meant to be passed to
sqlite2_open_v2(). Quoting SQLite C API Reference[1]:

[...]
#define SQLITE_OPEN_PRIVATECACHE     0x00040000  /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_WAL              0x00080000  /* VFS only */

As discussed in the SQLite WAL page[2], the way to convert a database to
the WAL mode is with a PRAGMA:

m_db->execute ("PRAGMA journal_mode=WAL");

Also, that promise from the WAL doc you have quoted:

"WAL provides more concurrency as readers do not block writers and a writer
does not block readers. Reading and writing can proceed concurrently."

Sounds a lot better than the reality. In particular, check the "Isolation
And Concurrency" section in the Isolation in SQLite[3].

Finally, note that ODB supports SQLite's unlock notification feature which
is another way to improve concurrency in SQLite.

[1] https://www.sqlite.org/capi3ref.html#SQLITE_OPEN_AUTOPROXY
[2] https://www.sqlite.org/wal.html
[3] https://www.sqlite.org/isolation.html
[4] https://www.sqlite.org/unlock_notify.html

Boris



More information about the odb-users mailing list