2

AIR プロジェクトで SQLite DB を使用しようとしていますが、特にベスト プラクティスに関するものなど、インターネット上で答えが見つからないように見えるいくつかの質問があるようです。

  1. 1 つ目は、同じアプリケーション インスタンスに複数の接続を持つことです。一部のアプリケーション プロセスでは、db を一瞬だけ使用する必要があり、同期タイプのコード フロー(try{}catch(){})で処理する方が適切です。一部のプロセスは時間がかかる場合があり、AsyncResponder を使用した非同期コード フローの方が適しています。

    このため、非同期の複数のインスタンスと同期 SQLConnection クラスの 1 つのインスタンスを持つ ConnectionPoolManager を持つことを考えました。これはまともな、良い、または絶対に凶悪なアイデアですか? これは次のポイントにつながります。

  2. 複数の非同期接続で非同期ステートメントを並行して実行するという問題はありますか? データベースがロックされていると不平を言う人がいるのを見てきました.一度に1つのステートメントしか書き込みを実行できないことを読みました.

    write ステートメントが execute(new Async...) のために呼び出され、別のステートメントがビジー状態にある場合はどうなりますか? エラーがスローされますか、それともタイムアウトを待ちますか?

この問題に関する説明をいただければ幸いです。1 回限りの質問に答える情報源に出くわしますが、特に私の質問には答えません。通常、私は自分でテストしますが、より重い使用レベルでのみ現れる落とし穴エラーを再現できないのではないかと心配しています.

編集: 半日無駄にした後に見つけた問題に関するドキュメントを次に示します。アドビ ドキュメント

4

1 に答える 1

2

SQLiteには書き込みの同時実行性はありません。ライターは、他のすべてのリーダーとライターをブロックします。

このような競合が発生するSQLErrorと、ID3119のがスローされます。この場合、アプリケーションは待機して再試行する必要があります。SQLiteには、このような待機を自動的に実行するための組み込み設定がありますが、これはAirによって公開されません。これはコードで手動で行う必要がありますが、これは簡単ではありません

したがって、SQLiteへの単一の接続を持つ方が簡単です。非同期で使用する場合は、でアクセスを管理する必要がありますMutex

于 2012-10-18T08:26:10.137 に答える