データベースからデータを書き込んだり取得したりする必要があるアプリを書いています。スレッド/非同期タスクでクエリを実行する必要があるかどうか疑問に思っています。これは、100ミリ秒未満かかるためです。実際、1回の呼び出しには通常約30〜70ミリ秒かかります(含まれるカーソルの解析中に)。この呼び出しは、2つの(異なる)データベースのそれぞれから1つの行のみを取得します。非同期タスクを追加すると、時間は120〜170ミリ秒になります(オーバーヘッドから推測します)。このような短い期間にスレッド/非同期タスクを使用することは価値がありますか(またはより良い方法ですか)?
5 に答える
別のスレッドでデータベースクエリを実行する理由は、データベースが(本番コードでは)完全に制御できない外部依存関係であるためです。つまり、クエリは通常は100ミリ秒で問題なく実行されるため、問題が発生し、クエリがまったく返されない状況を処理する方法が必要になる場合があります。この機能を別のスレッドにカプセル化することで、問題が発生したときに何が起こるかをより適切に制御できます。たとえば、データベースに問題がある場合、コードがエラーが発生したと見なして、プログラム全体をブロックして再起動を必要とせずに、ハングしたクエリスレッドを再試行または強制終了できるタイムアウト期間を設定できます。続ける。私が今言ったことを実行するためのいくつかのテクニックがあるので、あなたの正確な状況が何を含むのか、そしてトレードオフが何であるのかわからないので、私はあまり具体的にすることはできません。
信頼できるマルチスレッドコードを書くのは大変な作業です。並行性の問題を解決するために 、時間をかけてGoetzの本「 JavaConcurrencyinPractice」を読んで理解することをお勧めします。
AsyncTaskでクエリを実行することをお勧めします。最初はすべてがスムーズに実行されますが、データベースが大きくなると、クエリに1秒以上かかる場合があります。そうすれば、UIをフリーズするだけでなく、ユーザーの待機ダイアログを表示できるようになります。
時間を消費することは、メインUIスレッドで実行しないでください。非同期タスクでDB操作を実行することを常にお勧めします。操作にかかる時間の測定基準である主な理由の1つは、電話の構成やその他のパラメーターによって異なります。
並列処理が必要な場合は、マルチスレッドが必要だと思います。コードが連続して実行される場合、つまり最初から最後まで次々に実行される場合は、スレッド化する必要はありません。
クエリ出力の結果に依存している場合は、いずれの場合も結果を待つ必要があります。
データベースのパフォーマンスを向上させるには、Prepared Statement Cachingの使用を検討してください(パラメーター化されたPreparedステートメントを使用)
これにより、パフォーマンスが向上するはずです。