MySQLCommand BeginExecuteReaderにAsyncCallbackパラメーターがないため、実質的に使用できません
-
22-07-2019 - |
質問
ここの誰かが私を助けてくれることを望んでいます。
私が働いている会社は、MSSQLの代わりにMySQLを使用することを好みます。 そこで、最新のドライバー(6.1)をダウンロードし、DBレイヤーを移植しています。
ただし、コールバックをパラメーターとして使用するBeginExecuteReader関数が見つかりません。
これには理由がありますか?または、MySQLで動作が異なりますか?
見た限りでは、コードがコールバックを発生させない場合、ポーリングする必要があり、それが遅くなります。接続ごとにブロッキングスレッドを使用することも避けたいものです。
これに取り組む方法はありますか? (おそらく、私の力を超えたドライバーの変更は別として)
R
解決
MySQLコネクタのバージョン6.3.4は非同期メソッドを実装しますが、非同期的にデリゲートを呼び出すだけであるため、呼び出しスレッドに対してブロックされませんが、ThreadPoolからスレッドを保存しません。 これに関するバグレポートはこちら。
そして、あなたが言ったように、コールバックパラメーターはありません。 これに関するバグレポートはこちら。
devartのデータプロバイダーは非同期メソッドを適切に実装していると思いますが、無料ではありません。
とにかく、非同期データベース呼び出しは、それ自体で全体的なスケーラビリティが向上することを意味しません。記事" データベース呼び出しは非同期ですか?"詳細な分析のため。
他のヒント
iはこのコネクタについて特に知りませんが、mysqlで見た他のすべてのコネクタは、execute()またはquery()呼び出し中にサーバーがデータを返すのを待つだけです。最も近いのは、「バッファなし」を使用することですバージョン。execute()またはquery()からすぐに戻りますが、次の行を要求しようとしたがmysqlサーバーからまだ到着していない場合はブロックします。
MySQLスレッドのサポートは、基本的に後付けのように思えます。
たとえば、C APIを使用して、発行されたクエリをキャンセルすることはできません。むしろ、クエリ関数は単にブロックします。複数の同時クエリを作成するには、クエリごとに1つのスレッドが必要です!
Postgresを使用してみてください。私はそれを使用していません(C APIは私を先送りにします-それらのすべてのtypedef)、それは確かにマルチスレッドクエリ(たとえば、非同期呼び出しなど)の適切なサポートを持っています。