27

サーバー アプリケーションのスケーラビリティを高める 1 つの方法は、IO バウンド操作 (ファイル、ソケット、Web 要求、データベース要求などの読み取り) を非同期で実行することです。これは、操作の実行中にスレッドをブロックするだけの ThreadPool でそれらを実行するという意味ではありません。正しい方法は、非同期 API (BeginRead、BeginGetResponse、BeginExecuteReader など) を使用することです。この問題は、CLR vi C# book で詳しく説明されています。

Linq to SQL での非同期クエリに関する記事を次に示します。

Nhibernate クエリを非同期で実行する方法はありますか? Linq to NHibernate はどうですか?

ありがとう、アンドレイ

4

5 に答える 5

12

非同期データベース呼び出しは、それ自体で全体的なスケーラビリティが向上することを意味するものではないことに注意してください。詳細な分析については、「データベース呼び出しを非同期にする必要がありますか? 」という記事を読むことをお勧めします。その記事からの引用は次のとおりです。

尊敬されているDB/Webアーキテクトの一人は、次のように述べています。
非同期操作を使用してWebサーバー上のブロックされたスレッドの数を減らすデータベースアプリケーションの場合、ほとんどの場合、時間の無駄です。小さなWebサーバーは、データベースのバックエンドが同時に処理できるよりもはるかに多くの同時ブロッキング要求を簡単に処理できます。代わりに、データベースでのサービスコールが安価であることを確認し、同時に実行されるリクエストの数を、正しく機能して全体的なトランザクションスループットを最大化するためにテストした数に制限します。

于 2010-10-07T20:36:57.287 に答える
12

複数の非同期呼び出しを Futures で書き換え可能

var footask = QueryFooAsync();
var bartask = QueryBarAsync();
var baztask = QueryBazAsync();

var foos = await footask;
var bars = await bartask;
var baz = await baztask;

// do something with foos, bars, baz

で置き換えることができます

var foos = session.Query<Foo>().....ToFuture();
var bars = session.Query<Bar>().....ToFuture();
var baz = session.Query<Bazes>().....ToFutureValue();

await Task.Factory.StartNew(() => var ignored = baz.Value)  // await the results

// do something with foos, bars, baz

これには、ラウンドトリップ時間が 3 回ではなく 1 回だけ支払われるという非同期コードよりも利点があります。

于 2013-09-05T13:56:56.510 に答える
9

残念だけど違う。NHibernate は、L2S のようにコマンド実行の内部実装を公開しません。

非同期クエリのサポートを追加するには、スレッドプールを使用するか、NH のパッチを作成する必要があります。これはコミュニティにとって非常に歓迎されることであり、良い練習になるでしょう (しかし、それは決して些細なことではありません)。

于 2010-03-21T20:59:01.823 に答える
1

NH では非同期クエリはまだサポートされていませんが、リクエスト スレッドからの実行中の (長時間実行される) db 呼び出しの望ましくない影響の一部を部分的に克服することができます。

必要なのは、スレッドプールを短時間実行操作と長時間実行操作に分割することです。もちろん、これは Threadpool と TPL の実際の実装では不可能ですが、待機可能なアイテムとカスタマイズされた並行性を備えた独自の Producer/Consumer キューを作成することで、非常に簡単に解決できます。

私がまとめた例を見てください: https://gist.github.com/3746240

コードは、Joseph Albahari と Ben Albahari による素晴らしい本「C# 5.0 in a Nutshell: The Definitive Reference」からコピー/貼り付けされ、私が変更を加えて、スケジューラーがアイテム処理専用のワーカー スレッドを作成するようにします。

于 2012-09-18T22:17:56.497 に答える