- PR -

毎回SqlConnectionのインスタンスを作成&接続することに関して

投稿者投稿内容
檜山
会議室デビュー日: 2006/04/13
投稿数: 15
投稿日時: 2006-05-10 13:18
VB6+ADOではSQL Serverに接続してデータ操作する手順として

  1. Form_LoadなどでPublicな変数にADODB.Connectionのインスタンスを格納、Openしておく
  2. 各関数では1を使い回してRecordSetのOpenやExecute処理
  3. Form_UnloadでConnectionをClose

という方法が私としては定石でした。

ただ、過去ログでも何件か質疑応答があったようなのですが
JOINやサブクエリではSQL文が複雑になってしまう場合などで
SqlDataReaderのReadループ中に別クエリを実行したいときには
その都度、SqlConnectionの別インスタンスを作って処理するんですよね?

これに関してADO.NETからはそうなったんだ、とそのまま受け入れてもいいのですが
他者に説明を求められたときに一応、私なりの解釈として
だいたい以下のような認識でよろしいのでしょうか?

  1. PublicなConnectionインスタンスを使い回すというやり方は
    どこかの関数内で勝手にCloseされる可能性があり
    クラスやメソッドの独立性を損なうため
    オブジェクト指向的見地からしても(するべきでは|でき)なくなった
  2. VB6+ADOではConnetionのOpenがそこそこの処理時間を要していたため
    処理速度を考慮して使い回す方法をとっていたが
    ADO.NETからはクライアント側で接続キャッシュを再利用する(?)ような仕組みがあり
    毎回SqlConnectionのインスタンスを作成&接続することに関して
    速度面であまり気にかけることはない

特に2は確たる情報ソースがあったわけでもないので
VB6+ADOの感覚だと遅くなるイメージが払拭できません。
ちなみに現在の開発環境はVB2005にSQL Server 2000(2005ではない)なのですが
その辺も関係してくる可能性があるのか、何か情報があれば教えてください。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-10 13:23
引用:

檜山さんの書き込み (2006-05-10 13:18) より:

ただ、過去ログでも何件か質疑応答があったようなのですが


だったら、コネクション プーリングだとか、
メソッド間クラス間をまたぐ Connection における DataReader の注意点だとか、
"即座に閉じるべきもの" だとか、そういった書き込みも目にしているハズですが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2006-05-10 13:44
さかもとです。
同じページに「複数フォームからのConnectionの共有」というスレッドがあります。
そちらが参考になるかと。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-10 14:27
引用:

檜山さんの書き込み (2006-05-10 13:18) より:

特に2は確たる情報ソースがあったわけでもないので
VB6+ADOの感覚だと遅くなるイメージが払拭できません。


確たる情報ソースが何かはわかりませんが
パターン&プラクティスにはこんな記述がありますね
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/dnpatterns/htm/pag/scalenetchapt06.asp

信用なら無いようでしたら、ご自分で接続時間を測定してはいかがでしょうか
檜山
会議室デビュー日: 2006/04/13
投稿数: 15
投稿日時: 2006-05-10 15:08
ご返答ありがとうございます。

コネクションプーリングに関しては以前ASP(.NETではない)+ADOの開発をした際に
既に目にしたことがあり、↓のサイトや
http://www.vacant-eyes.jp/Tips/tadonet/040.html
検索して見つかる他のスレッドなども読んだつもりなので
なんというか…速度面で気にかけなくても大丈夫、というのはわからなくもないのですが
その一方でVB6+ADOでRecordSetのループ中に毎回ConnectionのOpenをすると
既存のConnectionを使い回すよりも遅かった、という事実というか経験があります。

そのためIIS上のASP+ADOやVB2005+ADO.NETでは
コネクションプーリングという仕組みがあるということがわかっていても
逆にVB6+ADOではなぜその仕組みが無効だった(?)のか、という疑問がわくというか…。

さかもと様が提示してくださっているスレッドでもR・田中一郎様の
引用:
なので僕も深く考えずに、必要に応じてこまめに接続してますが、
接続処理自身に負荷がかかったりしないんでしょうか?


という投稿で止まっているようですが、
これも同じような心配をしていらっしゃるのではないかという気がしています。

また、かるあ様がおっしゃる通り最終的には
信用ならないのであれば自分で検証…という話になると思うのですが
VB6+ADOだと「使い回ししたもの」と「毎回接続したもの」で速度比較ができたので
結果、前述の通り接続プーリングが機能しないようなので
処理速度を優先させて接続を使い回す方法で落ち着いたわけですが
ADO.NETではそもそもその「使い回し」ができないため速度比較することもできず
最初の投稿で申し上げたように
「ADO.NETからはそうなったんだ、とそのまま受け入れ」る感じで
なんとなくモヤモヤするというか…

ただ、少なくとも皆さんは毎回接続・切断しているということですよね?
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-10 15:34
引用:

檜山さんの書き込み (2006-05-10 15:08) より:

そのためIIS上のASP+ADOやVB2005+ADO.NETでは
コネクションプーリングという仕組みがあるということがわかっていても
逆にVB6+ADOではなぜその仕組みが無効だった(?)のか、という疑問がわくというか…。


なぜ無効だったのかは解りませんが、プーリング自体は出来たみたいですね。
http://www.atmarkit.co.jp/fjava/devs/review03/review03_1.html

引用:

ADO.NETではそもそもその「使い回し」ができないため速度比較することもできず
最初の投稿で申し上げたように


接続文字列に "Pooling=false" を入れてテストされてはどうでしょう

引用:

ただ、少なくとも皆さんは毎回接続・切断しているということですよね?


出来るだけ短いスコープで接続・切断をするようにしています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-10 15:35
引用:

檜山さんの書き込み (2006-05-10 15:08) より:

その一方でVB6+ADOでRecordSetのループ中に毎回ConnectionのOpenをすると
既存のConnectionを使い回すよりも遅かった、という事実というか経験があります。

そのためIIS上のASP+ADOやVB2005+ADO.NETでは
コネクションプーリングという仕組みがあるということがわかっていても
逆にVB6+ADOではなぜその仕組みが無効だった(?)のか、という疑問がわくというか…。


改善されたテクノロジについて、改善前の問題を持ち出されても...
「改善前は、なぜ改善されていないのか?」と言っているのと同じですね。

引用:

さかもと様が提示してくださっているスレッドでもR・田中一郎様の
引用:

なので僕も深く考えずに、必要に応じてこまめに接続してますが、
接続処理自身に負荷がかかったりしないんでしょうか?


という投稿で止まっているようですが、
これも同じような心配をしていらっしゃるのではないかという気がしています。


止まってはいないですね。(;^-^)
負荷が全く増えないわけではないですが、接続しっぱなしによる危険コストの方が高いです。

引用:

ADO.NETではそもそもその「使い回し」ができないため速度比較することもできず


できますけど...

引用:

ただ、少なくとも皆さんは毎回接続・切断しているということですよね?


なんか堂々巡りになっていますね。
答えを出しても、それを疑って出発点に戻られるので、一歩も進むことができないでいます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-10 15:54
引用:

檜山さんの書き込み (2006-05-10 15:08) より:

なんというか…速度面で気にかけなくても大丈夫、というのはわからなくもないのですが
その一方でVB6+ADOでRecordSetのループ中に毎回ConnectionのOpenをすると
既存のConnectionを使い回すよりも遅かった、という事実というか経験があります。



誤解しているのかもしれませんが・・・
ループの中で Connection の Open をするというのはループの中でOpen/Closeを繰り
返すということでしょうか?
例えば、ひとつのパターンとして、

(1)データをメモリ上に読み込む
(2)メモリ上のデータを編集する
(3)メモリ上のデータを書き戻す

という手順がある時、(1) と (3) で接続するか、(1)で接続したものを(3)でも使う
か?、ということを考えると、間違いなく前者を選ぶべきだと思います。
しかし、(1) と (3) のループ内で、接続を繰り返すことはしなくて良いと思います。

引用:

檜山さんの書き込み (2006-05-10 15:08) より:

ただ、少なくとも皆さんは毎回接続・切断しているということですよね?



この辺りは、僕も学んだばかりのコネクションプーリングや、DataSet でググって
関連の記事を読めば、迷いはなくなると思うんですけど・・・

スキルアップ/キャリアアップ(JOB@IT)