2012-05-10 1 views
5

私はOracleとMysqlを使用していますが、私はコールを発行したり、何か他のことをしたりして戻ってきて、後でそれを拾うなど、APIが書かれていない理由を理解するのに苦労しています。データを待つためにスレッドを専用にする。 SQLインターフェイスは、同期IOがまだ強制されている唯一の場所であると思われます。つまり、DBを待っているスレッドを縛るということです。メジャーDBベンダーはなぜ真に非同期APIを提供していないのですか?

誰でもこの理由を説明できますか?これを困難にする根本的なものがありますか?

ワーカースレッドを使用してデータを取得するのではなく、DBクエリの問題と結果のフェッチを管理するには、1-2スレッドを使用できることは素晴らしいことです。

私は非同期APIを実装する際に2つの実験的な試み(例:adbcj)がありますが、どちらもプロダクションでは使用できないようです。

+0

私もこのことに驚いていました。 –

答えて

1

データベースサーバーは、何千ものクライアントを処理できる必要があります。非同期インターフェイスを提供するには、DBサーバーは結果セットをメモリ内に保持する必要があります。そのため、後でそのデータセットを取得できます。すぐにリソースがなくなります。

+1

私はあなたの意見をある程度見ていますが、これはとにかく起こっています。大きな結果をフェッチすると、通常、一度に結果セット全体が取得されるわけではありません。 – jasonk

1

asyncの大きな問題は、多くのライブラリがトランザクションにthreadlocalを使用することです。

たとえばJavaのJDBC仕様の多くは、トランザクションごとに単一スレッドを実現するための同期動作に依存しています。つまり、手続き順にトランザクションを書いています。

これを行うには、コールバックを使用して適切なトランザクションを実行する必要がありますが、そうではありません。私はこれを行うnode.jsだけを知っていますが、実際には非同期であるかどうかは不明です。

もちろん、非同期の場合でも、おそらく同期を行っている場合は、データベース自体のパフォーマンスが向上するかどうかはわかりません。 Is asynchronous jdbc call possible?

は個人的にこの問題を回避するために、私はRabbitMQのようなメッセージバスを使用します。

は(Java)の中で過剰人口スレッドを避けるために多くの方法があります。

関連する問題