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

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

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

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

2229閲覧

SQLのSELECT文が一定の間隔で止まる

hnikichi

総合スコア0

C#

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2020/07/30 10:16

編集2020/07/31 02:46

お世話になります。

SQLServerからデータを取得するプログラムをC#のWindowsFormで作成しています。

環境

クライアントWindows10 1909
データベースSQLServer2019
開発言語C# .NetFramework4.7.2

発生している問題

起動時にDLLの接続オブジェクト(SQLConnection)をオープンし、
そのオブジェクトをWindowsFormアプリケーションで起動から終了まで利用しています。

大体30秒~40秒ぐらいの感覚でExecuteReaderメソッドが2秒ほど止まります。

7/31追記
テストプログラムを作成し、3分ほど5秒間隔でExecuteReader()を実行して、実行する前と後で、時間を出力しています。下記のような感じです。 09:46:00 ExecuteReader() 09:46:00
09:45:55 ExecuteReader() 09:45:57
09:45:50 ExecuteReader() 09:45:50
真ん中のように30秒程度の間隔でメソッドの前後で2秒ほど空きます。

該当のソースコード

□DLL内
System.Data.SqlClient.SqlConnection cnc = new System.Data.SqlClient.SqlConnection();
cnc.ConnectionString = "Data Source=[サーバー名];Initial Catalog=[データベース名];User ID=[ユーザーID];Password=[パスワード];";
cnc.Open();

□WindowsFormプログラム内
private void Button_Click(object sender, EventArgs e)
{
System.Data.SqlClient.SqlCommand cmd = cnc.CreateCommand();
cmd.ComandText = "SELECT TOP1 * FROM [テーブル] WHERE [コード] = 1";
System.Data.SqlClient.SqlDataReader rst = cmd.ExecuteReader(); //30秒に一回ぐらいここで2秒ほど止まる

}

7/31追記
下記のようなテストコードで再現
private void Button_Click(object sender, EventArgs e)
{
test a = new test();
a.Read();
}
class test
{
void read()
{
System.Data.SqlClient.SqlConnection cnc = new System.Data.SqlClient.SqlConnection();
cnc.ConnectionString = [接続文字列];
cnc.Open();
System.Data.SqlClient.SqlCommand cmd = cnc.CreateCommand();
cmd.ComandText = "SELECT TOP1 * FROM [テーブル] WHERE [コード] = 1";
System.Data.SqlClient.SqlDataReader rst = cmd.ExecuteReader(); //30秒に一回ぐらいここで2秒ほど止まる
rst.Close();
cnc.Close();
}
}

ただし、イベントに直接記述するとならない
private void Button_Click(object sender, EventArgs e)
{
System.Data.SqlClient.SqlConnection cnc = new System.Data.SqlClient.SqlConnection();
cnc.ConnectionString = [接続文字列];
cnc.Open();
System.Data.SqlClient.SqlCommand cmd = cnc.CreateCommand();
cmd.ComandText = "SELECT TOP1 * FROM [テーブル] WHERE [コード] = 1";
System.Data.SqlClient.SqlDataReader rst = cmd.ExecuteReader(); //30秒に一回ぐらいここで2秒ほど止まる
rst.Close();
cnc.Close();
}

試したこと

接続文字列に"ConnectionTimeout=0;" 追記
接続文字列に"ConnectRetryInterval=1;" 追記

ネットワークドライバの更新
ネットワークドライバの変更

補足情報

SQLServer2019の入ってるサーバーでアプリを実行しても同様の現象が出るが、LANケーブルを抜くと出ない。

ネットワーク環境によって挙動が変わったので追記します。
SQLServerにWinformアプリを入れてLANケーブルをささずに検証・・・OK
SQLServerにLANケーブルをさす・・・NG
接続先のネットワークにWindowsのDC追加・・・OK

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/30 11:12 編集

> 起動時にDLLの接続オブジェクト(SQLConnection)をオープンし、そのオブジェクトをWindowsFormアプリケーションで起動から終了まで利用しています。 そこがそもそもの問題の原因では? Open して使い終わったら即 Close したらどうなりますか?
hnikichi

2020/07/30 11:21

回答ありがとうございます。 ExecuteReaderメソッドを使用する前に、Open、使い終わった後にCloseしても結果は同じです。 ※Closeした後にDispose()、Open()する前にnew も試してみました。
sazi

2020/07/30 12:00

そのSQL自体を直接実行した場合はすぐに結果が却ってくるのですよね? また、SQLをエラーになる内容(存在しないテーブルとか)にして実行したらどうなるでしょうか。
YAmaGNZ

2020/07/30 21:57

SurferOnWwwさん、横からすみません。 コネクションをOpenし続けるとこのような問題の原因となるという根拠があれば知りたいです。 何かしらの資料があれば教えてください。
hnikichi

2020/07/30 23:21

いろいろ回答ありがとうございます。 >そのSQL自体を直接実行した場合はすぐに結果が却ってくるのですよね? SSMS等で実行した場合は止まりません >SQLをエラーになる内容(存在しないテーブルとか)にして実行したらどうなるでしょうか。 CommandTimeoutに設定した時間後エラーが返ってきます。 さらに調査を進めた結果を追記します。 接続オブジェクトに関わらず、ExecuteReaderメソッドをインスタスを生成したクラス内のメソッドで実行すると現象が発生するようです。DLLに限らず、同プロジェクトでクラスを追加した場合も現象が発生しました。ロカールイベント内でExecuteReader()を実行し続けても発生しませんでした。 また、原因が実行環境に依存するか調査を行った結果、現象が出る端末をAD構成されてるネットワーク環境につなぐと、ドメインに参加、不参加関係なく現象が出ませんでした。 ただ、AD構成外のネットワークでは、DNSやDHCPの有無では解決しませんでした。 SQLServerとアプリケーションを同じ端末にいれて、ネットワークに接続せず単独で実行すると現象は出ませんでしたが、AD構成されてないネットワークにつなぐと発生します。
sazi

2020/07/31 00:07 編集

接続自体が待たされている感じですね。 セッションが異常に増えていたりはしませんか? 若しくは可能なセッション数が著しく低く設定されているとか。
hnikichi

2020/07/31 00:20

>セッションが異常に増えていたりはしませんか? >若しくは可能なセッション数が著しく低く設定されているとか。 接続自体が待たされている可能性が高いと思ってるのですが、 可能なセッション数を増やしても、1台一回接続だけにしても発生してしまいます。
sazi

2020/07/31 00:24

SSMSの利用状況モニターでは確認されていますか? 応答が返る直前に全体でみると変化がみられるのではないでしょうか。
hnikichi

2020/07/31 00:37

>SSMSの利用状況モニターでは確認されていますか? 利用状況モニターはもちろん、 sys.dm_exec_sessions と sys.dm_exec_connections でリアルタイムで確認してみました。 またパフォーマンスモニタ等でログを追いかけてみました。 セッション数や接続数で特に大きな変化はありませんでした。 ただOSのリソースモニタで、ネットワークの活動の挙動が再接続を試みているような感じはします。
退会済みユーザー

退会済みユーザー

2020/07/31 00:48 編集

> 大体30秒~40秒ぐらいの感覚でExecuteReaderメソッドが2秒ほど止まります。 「30秒~40秒」の間はどのような操作をしているのでしょう? 「2秒ほど止まります」はどのように確認しているのでしょう? 全体の構成はどうなっているのですか? 「AD構成」という言葉が出てくるので以下のようになっていると想像していますが、どうでしょう? クライアント PC (Winforms アプリ) ⇔ 社内 LAN ⇔ サーバー (SQL Server) SQL Server への接続プロトコルは何ですか? 上記構成だと tcp しかなさそうですが、接続文字列でそれを指定しないのは何か理由がありますか? > ExecuteReaderメソッドをインスタスを生成したクラス内のメソッドで実行すると現象が発生するようです。DLLに限らず、同プロジェクトでクラスを追加した場合も現象が発生しました。ロカールイベント内でExecuteReader()を実行し続けても発生しませんでした。 コードはどう違うのでしょうか? 「ローカルイベント」という言葉が分からないのですが、それは構成も違うということですか? > 原因が実行環境に依存するか調査を行った結果、現象が出る端末をAD構成されてるネットワーク環境につなぐと、ドメインに参加、不参加関係なく現象が出ませんでした。 「AD構成」というのは上にも書いた以下と想像してますが違いますか? クライアント PC (Winforms アプリ) ⇔ 社内 LAN ⇔ サーバー (SQL Server) では、問題が出るという「AD構成外のネットワーク」はどのような構成なのでしょう? 以上、お手数ですが、質問文を編集してできるだけ具体的に追記いただけませんか。
sazi

2020/07/31 00:49 編集

SSMSでの実行は早いとの事ですが、そのSSMSは「AD構成されてないネットワーク」かつプログラムと同じ認証方式で接続していますか?
退会済みユーザー

退会済みユーザー

2020/07/31 01:08

もう一つ質問すみません。 > SQLServer2019の入ってるサーバーでアプリを実行しても同様の現象が出るが、LANケーブルを抜くと出ない。 それは以下のようなことで、その状況は今も変わってないのですか? NG: クライアント PC (Winforms アプリ) ⇔ 社内 LAN ⇔ サーバー (SQL Server) NG: クライアント PC ⇔ 社内 LAN ⇔ サーバー (Winforms アプリ ⇔ SQL Server) OK: クライアント PC ⇔ × (LAN ケーブルを抜く) ⇔ サーバー (Winforms アプリ ⇔ SQL Server)
hnikichi

2020/07/31 01:14

SurferOnWwwさん >「30秒~40秒」の間はどのような操作をしているのでしょう? 「2秒ほど止まります」はどのように確認しているのでしょう? テストプログラムを作成し、3分ほど5秒間隔でExecuteReader()を実行して、実行する前と後で、時間を出力しています。下記のような感じです。 09:46:00 ExecuteReader() 09:46:00 09:45:55 ExecuteReader() 09:45:57 09:45:50 ExecuteReader() 09:45:50 真ん中のように30秒程度の間隔でメソッドの前後で2秒ほど空きます。 >全体の構成はどうなっているのですか? 「AD構成」という言葉が出てくるので以下のようになっていると想像していますが、どうでしょう? クライアント PC (Winforms アプリ) ⇔ 社内 LAN ⇔ サーバー (SQL Server) 社内LAN内に別のWindowsServerでDCを立て、ADを構成したネットワークにつないだ場合、ADのドメインに参加してもしなくても、現象は再現しません。SQL Serverがドメインに参加しててもしてなくても、また実行クライアントがドメインに参加しててもしてなくても、同じです。 しかし、社内LAN上にDCがないネットワークの場合は(上記DCServerを社内LANから切り離した場合)、また PC (Winforms アプリ) ⇔ ルーター⇔ サーバー (SQL Server)とした場合でも現象は発生しました。ルータDNSやDHCPの原因を考慮し、 PC (Winforms アプリ) ⇔ HABー⇔ サーバー (SQL Server)とした場合でも現象を確認しています。 >SQL Server への接続プロトコルは何ですか? 上記構成だと tcp しかなさそうですが、接続文字列でそれを指定しないのは何か理由がありますか? すみません、指定した場合でも現象が出たので質問文に記述していませんでした。 記述した場合でも現象を確認しています。 >コードはどう違うのでしょうか? ExecuteReader()を行っている処理をクラスのメソッドに記述し、そのクラスをクリックイベントから呼び出した場合(下記aのクラスのbメソッドを呼び出した場合)と、クリックイベント内でクラスのメソッド内のコード(下記処理C)を直接書いた場合です。 class a { void b() { //処理C } } >「AD構成」というのは上にも書いた以下と想像してますが違いますか? 社内LAN上にDCが存在します。 >では、問題が出るという「AD構成外のネットワーク」はどのような構成なのでしょう? ネットワーク上にドメインコントローラーがいません 説明がわかりにくくて申し訳ありません。 よろしくお願いします。
hnikichi

2020/07/31 01:22

>SurferOnWwwさん >それは以下のようなことで、その状況は今も変わってないのですか? NG: クライアント PC (Winforms アプリ) ⇔ 社内 LAN ⇔ サーバー (SQL Server) NG: クライアント PC ⇔ 社内 LAN ⇔ サーバー (Winforms アプリ ⇔ SQL Server) OK: クライアント PC ⇔ × (LAN ケーブルを抜く) ⇔ サーバー (Winforms アプリ ⇔ SQL Server) 上記OKなのはサーバーのネットワークアダプタから、LANケーブルを抜いた場合、サーバーでWinformアプリを実行した場合です。 しかし、サーバーにLANケーブルをつなぎ、HABに接続する、HABはそのサーバー以外に接続されていない状態だとNGになります。物理的ネットワークアダプタのLINKランプがついたときにNGになると思われます。ちなみに、その状態でネットワークアダプタをOSの設定で無効にした場合はOKになりました。 ネットワークアダプタのドライバを更新しても、別のアダプタに変えても現象は変わりませんでした。
hnikichi

2020/07/31 01:26

saziさん >SSMSでの実行は早いとの事ですが、そのSSMSは「AD構成されてないネットワーク」かつプログラムと同じ認証方式で接続していますか? そのSSMSは「AD構成されてないネットワーク」かつプログラムと同じ認証方式で接続しています。 補足ですが VBAマクロでADOから同じ接続で実行しても現象は出ませんでした。
sazi

2020/07/31 01:27 編集

プログラムのDBserverへの接続をIPアドレス直接指定にして確認してみては。
退会済みユーザー

退会済みユーザー

2020/07/31 01:27

お手数ですが、2020/07/31 10:14 と 2020/07/31 10:22 のコメントを、質問欄を編集してそれに追記いただけませんか? コメント欄は初期画面では開かないので読まない閲覧者・回答者がいると思いますので。
退会済みユーザー

退会済みユーザー

2020/07/31 01:56 編集

2020/07/31 10:22 のコメントの件ですが、その中で NG の場合も、DC が LAN に接続されていると OK になる、DC が接続されていないときコメントの通りということなのですよね? とすると、DC に実装されている DNS の有無の違い? でも、Open しっぱなしという話でしたから Open の時点で名前解決は済んでいそうで、DC の DNS の有無の違いが影響するというのが解せません。 また、「物理的ネットワークアダプタのLINKランプがついたときにNG」というのは DC の存在とは関係なさそうなのが解せません。 それから、.dll を使う場合うに問題が起きるが、.dll のコードを WinForms プロジェクトのコード内に取り込んで、.dll を使わないようにすると問題は起きないそうですが、それと DC の存在は関係なさそうなのも解せません。 ・・・質問に書いてないことがいろいろありそうで、それが複雑(?)に影響して問題を起こしているような気がします。
hnikichi

2020/07/31 02:21

saziさん 接続をIPにしてみても結果は変わりませんでした。 hostsを変更したりしてみたのですが結果は変わりませんでした。 SurferOnWwwさん ネットワークについては理屈はわかりませんが、ネットワークアダプタにケーブルをつなげてるかどうか、またつなげてる場合はその先にDCが存在するかどうかで分かれます。 原因はやはり接続の部分だと思うのですが、プログラム、Server、ネットワークそれぞれ何らかの複合的な要因があるのかもしれません。 プログラムでは接続をOpenしっぱなしの場合でも、適時閉じても現象が変わらないです。 ただ30秒という間隔が何らかの設定のような気がするのでその辺をもう少し調べてみたいと思います。
退会済みユーザー

退会済みユーザー

2020/07/31 02:30 編集

> ネットワークについては理屈はわかりませんが、ネットワークアダプタにケーブルをつなげてるかどうか、またつなげてる場合はその先にDCが存在するかどうかで分かれます。 それと .dll による影響に問題がありそうな気がします・・・が、ここに書いてある以外のことは分からない自分には問題の特定は無理そうです。 対症療法的ですが、WinForms アプリに接続に必要なコードを書いて問題の .dll を使わなくて済むように 対応できるならそうしてはいかが・・・ぐらいしか提案できることはなさそうです。
sazi

2020/07/31 02:30

pingやネットワーク経路の確認はされているのですよね?
hnikichi

2020/07/31 02:39

saziさん >pingやネットワーク経路の確認はされているのですよね? pingやネットワーク経路問題はないです。
sazi

2020/07/31 02:42

因みに接続はODBCですか? もしそうなら、オプション項目が関係したりしていないでしょうか
sazi

2020/07/31 02:53

> SQLServer2019の入ってるサーバーでアプリを実行しても同様の現象が出るが、LANケーブルを抜くと出ない。 どうみても、どこかにアクセスしようとしてますよね。 オプションにColumnEncryptionとかあったりするので気になります。
guest

回答1

0

自己解決

いろいろご回答していただいてありがとうございました。

根本的な解決にはなりませんが、原因が不明なため、ネットワークを再構築してもらうことになりました。
いろいろ回答していただいた方々には感謝申し上げます。
ありがとうございました。

投稿2020/07/31 07:51

hnikichi

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問