2012-01-04 15 views
0

SQLiteを使用してトランザクションを明示的に作成しています。つまり、挿入をバッファリングするSQLiteを取得するには?

sqlite3_exec(db、 "BEGIN"、NULL、NULL、NULL);

インサート

sqlite3_exec(DB、 "END"、NULL、NULL、NULL)の束を行います。

データベースには、ENDがヒットするまでこのペアの間に挿入をバッファリングし、すべてをディスクにフラッシュします。

定期的にディスクにフラッシュする代わりに、このようには見えません。

私は時々、別のプロセスから同じデータベースでselect文を実行できないことに気付きました。トランザクションの使用戦略に関連している可能性があります。このような場合、選択はデータベースのLOCKまたはBUSY状態のために失敗します。

誰でもSQLiteを扱う方法を知っていますので、パフォーマンスを向上させるために挿入をバッファしますか?

多くのありがとうございます!

答えて

1

トランザクションは、トランザクションが完了するまで(またはロールバックされるまで)SQLiteがデータベースファイルにコミットするのを防ぎますが、ジャーナルファイルを更新する必要があるため、SQLiteがディスクへの書き込みを停止することはありません。

メモリ内のデータベースを使用して、メモリベースのデータベースをファイルベースのデータベースに書き込むことで、この問題を回避できます。さらに詳しい情報はIn-Memory Databases

また、SQLiteの標準ジャーナルモデルは、1つのライターまたは複数のリーダーをサポートしていますが、両方をサポートしていないため、選択しようとするとLOCK/BUSY状態になります。これを回避するには、ロールバックメソッドの代わりにWALジャーナルメソッドを使用する必要があります。詳細はこちら:Write-Ahead Logging

関連する問題