1

sqliteデータベースデータにアクセスするためのマルチスレッド(メインスレッドでの書き込みと読み取りの実行にNSOperationQueuesを使用)アプリケーションを作成しようとしています。sqliteはデフォルトではスレッドセーフではないことを理解していますが、マルチスレッドプリプロセッサマクロを追加し、ジャーナルモードをwalに設定しました。

このsqliteのドキュメントによると:http ://www.sqlite.org/faq.html#q6何かを書く前に、準備されたすべてのステートメントを完成させる必要があるようです。これは本当ですか?これを回避する方法はありますか?同じデータベースへのハンドルが2つある場合はどうなりますか?

基本的に、一度に複数の読み取りと1つの書き込みを実行したいのですが、最善の方法を見つけようとしています。

前もって感謝します。

4

1 に答える 1

2

スレッド モードは、コンパイル時、起動時、または実行時オプションによって決まります。詳細はこちら:

http://www.sqlite.org/threadsafe.html

ドキュメントには、シリアライズがデフォルトであると書かれています。これは、複数のスレッドから使​​用しても問題ないことを意味します。すべてのアクセスがシリアライズされることで保護されます。さらに並列処理が必要な場合は、複数の接続オブジェクトでマルチスレッド モードを使用できます。

マルチスレッドを使用する場合は、同じ db 接続オブジェクトが一度に複数のスレッドで使用されないようにしてください。

マルチスレッド。このモードでは、1 つのデータベース接続が 2 つ以上のスレッドで同時に使用されない限り、SQLite を複数のスレッドで安全に使用できます。

ただし、複雑さが正当化されることを確認してください。すべてのパフォーマンスの問題と同様に、前後に測定してください。

編集:これを確実にする1つの方法は、独自のプーリングメカニズムを作成することです。各並列タスクが取得してプールに解放する n 接続ハンドルのプールを作成します。ドキュメントによると、マルチスレッドモードは接続全体で完全に安全です。そうすれば、他のすべてのトランザクションやステートメントがファイナライズされることを心配する必要はありません。個別の読み取りスレッド/接続と書き込みスレッド/接続は、事実上、非常に単純なハードコーディングされたプールです。

于 2012-07-03T04:13:24.117 に答える