質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

7020閲覧

C#でのMySQLClientを使ったMySQLへの接続について

siksmtt

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/07/24 01:13

編集2018/07/24 01:47

前提・実現したいこと

C#でMySQLConnector/NETを使ってMySQLサーバーへの接続をしたいと思っています。

発生している問題・エラーメッセージ

openメソッドに7秒前後の時間がかかり、製作しているソフトウェアとしては致命的な問題になっています。
エラー等は発生していません。

該当のソースコード

string sendCommand = "host=接続先のIPv4; userid=ここでは伏せます; password=ここでは伏せます; SslMode=none;"; MySqlConnection mysqlConnention = new MySqlConnection(sendCommand); mysqlConnention.Open(); //ここを実行すると7秒前後時間がかかります mysqlConnention.Close();

試したこと

・接続先サーバを変える
・接続するユーザーやデータベースの明示的指定や変更
・接続先サーバの再起動(OSそのものも行いました)
・sendCommandのパラメーター指定の変更
Interactive=true; AllowBatch=false; CacheServerProperties=true;
上記については関係がありそうだったので(個別・合わせて)いくつかのパターンを試しました

・パッケージ(MySql.Data.MySqlClient)の再インストール

補足情報(FW/ツールのバージョンなど)

コマンドラインからMySQLサーバーへの接続自体は成功しており、当ソースでも接続自体は成功しているので、エラー等は発生していません。

パケットキャプチャしてみる限り、ServerGreetingを受信した後にソース側がLoginRequestを送信するまでに時間がかかっています。
ServerGreetingパケットに「7秒前後待つようなフラグが設定されているのか」と思い、正常時(スムーズに接続できるODBC版)とのパケットをビット単位で目視比較しましたが差分は見られませんでした。
また、10%ぐらいの確率でミリ秒単位での接続になる時もありますが、発生条件などが分かっていません。

ODBC版でも試したのですがそちらは今のところ100%スムーズに接続ができます。
またネットワークが不安定ということもありません。
使っているVisualStudioは2017Community、インストールしたMySqlClientは8.0.11になります。
接続先サーバはUbuntu 16.04上の5.7.22のものと、Windows10 Pro上の10.1.28のもので試しました。
(Windows10の方はxamppで構築したものになります)

C#を始めて半年ほどの初学者になりますので説明不足・誤認識などはあるかと思いますが、こんなに時間がかかるものなのでしょうか?
恐れ入りますがご助言いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/24 01:46

Connector/NET を利用して接続プールは有効になっているという状態ですか? そのあたりの情報を書いてください。
siksmtt

2018/07/24 01:52 編集

ご質問ありがとうございます。 Connector/NET を利用しているということでお間違いないです。 接続プールは下記のサイトの最後によるとデフォルトで有効(true)になっているということだったので、 そのままpoolingの指定をしないパターン(=trueのまま)と、falseを明示的に指定したパターンの両方を試しました。 サイト: https://dev.mysql.com/doc/connector-net/en/connector-net-connection-options.html (当サイトを使うのが今回初めてで、先ほど誤った投稿をしてしまいました。通知がいってしまっていたら申し訳ありません...)
退会済みユーザー

退会済みユーザー

2018/07/24 03:19

とすると自分には見当がつきません。環境も特殊なようですし。お役に立てずすみませんが、他の方の回答をお待ちください。
siksmtt

2018/07/24 04:03

いえ、ご指摘いただきありがとうございました。自分で調べながら気長に待ってみようと思います。
hihijiji

2018/07/24 06:33

クライアント側の環境に触れてないようですが、そちらのほうが怪しいのでは?それとも複数の環境で十分テスト済みなのでしょうか?
siksmtt

2018/07/24 06:55

hihijiji様 ご質問ありがとうございます。クライアント側の環境をほぼ調べていないのは、(リモート・ローカルどちらとも)コマンドライン上から・ODBC版(using System.Data.Odbcといえば伝わるでしょうか...)・MySQLサーバーに接続のみを行うような他ソフトウェア(詳細は申し上げられません...)の3点から、7秒も時間がかかるような現象が確認できていないので、ほとんど調べていない現状になります。私自身が構築した以外のクライアントでも同様の現象になるので、あとは同僚にもConnector/NETで組んで同レベルで確認してもらう予定ではあるのですが、検索しても特にヒットするものがなかったので他のC#を使われている方はどうなのだろうと思い、質問させていただいた次第であります。
hihijiji

2018/07/24 07:05

私の経験では、EntityFramework経由で初回接続2~3秒(素ならもっと早いと思う)って所だと思います。2回目以降は一瞬です。最近のMySqlClientは試してませんが…
siksmtt

2018/07/24 07:23

hihijiji様 ご返信ありがとうございます。EntityFramework自体は存じ上げているのですが、実際に試したことはないので、そちらも試してみようと思います...。初回接続で2~3秒ならそれほど問題はないのですが、ほぼ毎回7秒前後かかっているので...。
hihijiji

2018/07/24 07:52

EntityFrameworkを使ったほうが大概遅くなると思います。対策としてアプリ起動時に非同期で捨て初回接続をしているので正確には測ったこともないですし、あまり気にしてません。
siksmtt

2018/07/25 02:25

hihijiji様 参考情報ありがとうございます。今EntityFrameworkを試してみようとNuGetからインストールをしたのですが、インストール前にMySql.Data(EntityFrameworkではない方)をアンインストールしたためか、実行時にExceptionが発生しました。これはどちらもインストールする必要があるということになるのでしょうか。(Exceptionの文言と自分で調べた結果、この考えに行きつきました)初歩的な質問で申し訳ございません。
siksmtt

2018/07/25 02:41

hihijiji様 度々すみません、上記の質問ですがMySql.Data.Clientを更新したところ正常にopen-closeまでできました。数回試しましたがEntityFrameworkのほうは特に問題なく接続できているので、これで安定して行えるか、制作ソフトの仕様検討も含めて様子見しようと思います。
hihijiji

2018/07/25 03:20

ひょっとしたら単に、MySql.Data.Clientのバージョンの相性かも知れませんね。
siksmtt

2018/07/25 04:33

hihijiji様 そうなのですかね...それにしても関連していそうな記事を見かけず、自分の環境だけで起きたのが不思議でたまりません(笑) 念のため公式の修正履歴なども探してみようと思います。
guest

回答1

0

自己解決

自己解決しました。
経緯としては以下のようになります。

7/25以降この件に手を付ける時間が全くなくしばらく放置していたのですが、
今日見たところConnector/NET (MySQL.Data.Client) の最新版が公開されていたので、
EntityFrameworkとMySQL.Data.ClientをNuget管理パッケージからアンインストール後、MySQL.Data.Clientのみを再インストールしたところスムーズに接続が行えるようになったことを確認しました。

(一応公式のリリースノートを見ましたが特に該当するようなバグ修正はありませんでした。
https://dev.mysql.com/doc/relnotes/connector-net/en/connector-net-news-8-0-12.html)

ということで8.0.11のClientは避けるような形で開発を継続していきたいと思います。
なお、原因は分かりません...。

SurferOnWww様、hihijiji様、ご助言いただきありがとうございました。

投稿2018/08/06 00:43

siksmtt

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siksmtt

2018/08/07 02:23

別のプログラミングFAQサイトでこの現象を聞いたところ、下記のバグに類似しているという回答がありました。 https://bugs.mysql.com/bug.php?id=80030 ただこのバグが修正されるのは次のリリースの8.0.13らしく、 私が使った8.0.12でもバグは顕在している認識だ、というアドバイスをいただきました。 これに当てはまるかどうかは分かりませんが、レビューしておこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問