関連する質問:マルチスレッド アプリケーションで SQLite を使用する方法。
私は、マルチスレッド プログラムで SQLite3 からまともなパフォーマンスを得ようとしています。書き込みレイテンシを除いて、そのパフォーマンスには非常に感銘を受けました。それは問題ではありません。ディスクが回転してデータをコミットするのを待つ必要があります。しかし、キャッシュから読み取ることができたとしても、これらの書き込み中に読み取りがブロックされることは、かなり耐えられません。
私の使用事例では、インデックス付きフィールドによって 1 つの小さなオブジェクトを取得するために多数の小さな読み取り操作が含まれますが、これらの操作は多数あるため、これらの操作には待機時間が重要です。書き込みは大きく、1 つのトランザクションに蓄積されます。書き込みが完了するため、読み取りに大きなレイテンシが発生することは望ましくありません。
最初に、ミューテックスを使用して単一の接続を使用して保護しました。ただし、書き込みスレッドがトランザクションの完了を待機している間は、ライターがミューテックスを解放するまでミューテックスを取得できないため、リーダーはディスク I/O でブロックされます。複数の接続を使用しようとしましたが、 から取得SQLITE_LOCKED
しsqlite3_step
ます。つまり、すべての読み取りコードを再設計する必要があります。
私の書き込みロジックは現在次のようになっています。
- 接続ミューテックスを取得します。
START TRANSACTION
- すべての書き込みを行います。(通常、小さいものは 10 ~ 100 個です。)
END TRANSACTION
-- ここでブロックします- ミューテックスを解放します。
私が知らない解決策はありますか?SQLITE_LOCKED
エントリがキャッシュにある場合、読み取りコードをすべて書き換えて処理、リセット、および再試行する必要がなく、ディスクの回転が完了するのをリーダーが待たないようにする簡単な方法はありますか?