2011-01-08 5 views
5

現在、1000件のアクションが数秒で発生するシナリオがあります。これらのアクションをすべてデータベースに保存する必要があります。効果的にデータベースに100秒から1000秒のアクションを記録する方法

私は現在、アイドルタイマーを保持しています。このタイマーがあらかじめ定義された時間に達すると、キャッシュされたアクション(最後のコミット以降のアクション - 単純なリストです)を取得し、それらのアクションをデータベースにコミットします。

UIは可能な限り応答性が必要です(duh?)。

データベースのログを別のスレッドにプッシュする以外に、他に誰かが私を助けてくれるパフォーマンスに関して他に何か提案がありますか?

+5

「100秒から1000秒のアクションが数秒で発生する可能性があります」 - それほど多くはありません! –

+0

私は、スレッドとコンカレントセーフキューのアイデアは別です。シンプル。クリーン。 (ライターのスレッドはキューが可能であればキューから一括して取り除くことができますが、そうでなければKISSです) –

答えて

4

非同期ロギングラッパーを持つNLogのようなサードパーティのロギングフレームワークを使用してみてください。

+1

私はこれに同意します。 log4netは私にとって非常にうまく機能します。 –

2

アクションが発生すると、ログファイルの末尾にアクションを記録します。これには2つの利点があります。それは本当に速く、あなたのUIは依然として敏感で、アプリケーションがクラッシュした場合でもアクションは失われません。

次に、ファイル内でアクションを実行し、データベースを更新するバックグラウンドスレッドを用意します。アプリケーションがクラッシュした後、再起動することができ、バックグラウンドスレッドは過去に安全に保存されたアクションで単に更新されます。バックグラウンド更新を行うアプリケーション/プロセス/ Windowsサービスを別途用意し、UIアプリケーションでログ書き込みのみを実行することもできます。

本当に別のスレッドを避ける必要がある場合は、データベースのudpateを非常に小さなバッチで実行する必要があります。そのため、できるだけ早く、アイドル時間の処理が必要です。しかし、データベース操作がUIと同期しているため、この方法は常に劣悪になります。したがって、あなたのUIはその期間中ハングします。接続の問題によるタイムアウトなどのデータベースの問題があれば、UIは終了します。

関連する問題