PRAGMA journal_mode=WAL、PRAGMA journal_size_limit=0 の db ファイルに継続的に書き込みを行っています。私の C++ プログラムには、リーダー (15 秒間隔でクエリ) とライター (5 秒間隔で挿入) の 2 つのスレッドがあります。
3 分ごとに挿入を一時停止して、モード パラメータを SQLITE_CHECKPOINT_RESTART としてライター スレッドから sqlite3_wal_checkpoint_v2() を実行しています。この時点でアクティブな読み取り操作が行われていないことを確認するために、チェックポイントが実行されようとしているというフラグを設定し、リーダーが完了する (接続がまだ開いている) のを待ってからチェックポイントを実行します。チェックポイントの完了後、クエリを再開しても問題ないことを再度読者に示します。
sqlite3_wal_checkpoint_v2() は SQLITE_OK を返し、pnLog と Ckpt は等しい (約 4000) として返され、完全な wal ファイルがメインの db ファイルと同期されたことを示します。したがって、ドキュメントに従って、次の書き込みは最初から開始する必要があります。ただし、後続の書き込みによって WAL ファイルが無限に大きくなり、最終的には数 GB になるため、これは発生していないようです。
いくつかの検索を行ったところ、開いているトランザクションが原因でリーダーがチェックポイントの失敗を引き起こす可能性があることがわかりました。ただし、私が使用している唯一のリーダーは、チェックポイントが開始する前にトランザクションを終了することです。WAL ファイルが大きくならないのを妨げているものは他にあるでしょうか?