お世話になります。
ADO.NETの接続型と非接続型の違いについて質問があります。
接続先のDB:AzureのSQL Database
###私の今の解釈
・接続型
明示的にcloseするまでDBとの接続状態は続く。
明示的にcloseするか、アプリケーションが自体が終了すれば、接続は切れる。
・非接続型
クエリを発行する度に接続と切断をする。したがって、毎回自動的に接続は切れる。
そこで、本当にその解釈が正しいか、検証してみたところ、以下の結果になりました。
###検証結果
・接続型で接続
①あえてcloseせず放っておいても、10分くらいすると接続が切れた。
②明示的にcloseしたとしても、すぐには接続は切れない。(10分くらいすると切れる)
・非接続型で接続
③クエリの処理が終了したとしても、すぐには接続は切れない。(10分くらいすると切れる)つまり②の場合と同じ動き。
推測していた動きと違うのは
・接続型でCloseしていなくても、しばらくしたら接続が切れた。
・非接続型でもすぐに切れるわけではなかった。
ということです。
これは、何故なのでしょうか?
接続型はバッチ処理のような連続でクエリを処理をする際に使い、それ以外の時はなるべくサーバーに負荷をかけないよう非接続型で接続する。というような使い分けで考えていたのですが、
上記の結果だけ見ると、あえて使い分ける意味があまりないように感じてしまいます。
以下、一応試したコードを示します。(例外処理などは省いています)
'VB.NET '接続型の処理---------------------- Using connection As New SqlConnection([DBへの接続情報]) connection.Open() Dim command As SqlCommand = connection.CreateCommand() command.Connection = connection command.CommandText = [適当なselect文] Dim reader As SqlDataReader = command.ExecuteReader() ・ ・selectした結果を読む処理 ・ connection.Close() 'あえてcloseしない時はこれをコメントした End Using '---------------------- '非接続型の処理-------------------- Dim conn As New SqlConnection() Dim command As New SqlCommand() Dim adapter As New SqlDataAdapter() Dim ds As New DataSet() conn.ConnectionString = [DBへの接続情報] command.Connection = conn command.CommandText = [適当なselect文] adapter.SelectCommand = command adapter.Fill(ds) ・ ・selectした結果を読む処理 ・ '----------------------
どちらもselect結果を取得することは出来ています。
また、すぐに接続が切れるわけではない。という部分は、コネクションプールか何かが関係しているのでしょうか?
以上、駄文で申し訳ありませんが、何か分かる方がおりましたら、よろしくお願いいたします。
###2017.1.13追記
肝心なところが抜けていました。
接続が切れている、切れていないをどう確認したかというと、Microsoft SQL Server Management Studio上で、
sys.dm_exec_sessions と sys.dm_exec_connectionsを参照して確認しました。
また、sys.dm_exec_sessionsにはSTATUSというカラムがあり、ここは主にrunningかsleepingのどちら
かになります。
もしかしたら、これが接続が切れている切れていないという意味なのか?とも思い、検証してみました。
そうしたところ、
接続型では、上記コードの
Dim reader As SqlDataReader = command.ExecuteReader()
非接続型では
adapter.Fill(ds)
を処理している間のみrunnigになるということが分かりました。
接続型ではconnection.Close()をしてもしていなくても処理が終了すれば、sleepingになるので、ここの値の意味が、接続が切れている切れていないではないようです。(結果的に蛇足です。すみません)
また、もう一つ分かったことがあります。
昨日の質問内容で、接続型でも非接続型でもすぐには接続は切れずに、しばらくすると切れると書きました。
これは、やはりコネクションプールの設定のようです。
接続文字列でPooling=Falseとして繋げたら、接続型でも非接続型でも、処理が終了したらすぐに切断されました。
なのでまとめると、DBとの接続が切断(解除?)されたというのは、コネクションの接続のこととは、また違う部分の話なのではないのかな。と推測しています。
私が昨日から目で確認していたものは、「コネクションが接続された。切断された。」という話で、ここまでは接続型でも非接続型でも仕組みは変わらないのではないかと思っています。
接続型と非接続型の違いは、コネクションを繋げた後の実際にデータにアクセスする時の動作のことかと思っているのですが、ここら辺について詳しい方いたら教えていただきたいと思います。
長文失礼いたしました。よろしくお願いいたします。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/17 03:00