- - PR -
毎回SqlConnectionのインスタンスを作成&接続することに関して
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-10 13:18
VB6+ADOではSQL Serverに接続してデータ操作する手順として
という方法が私としては定石でした。 ただ、過去ログでも何件か質疑応答があったようなのですが JOINやサブクエリではSQL文が複雑になってしまう場合などで SqlDataReaderのReadループ中に別クエリを実行したいときには その都度、SqlConnectionの別インスタンスを作って処理するんですよね? これに関してADO.NETからはそうなったんだ、とそのまま受け入れてもいいのですが 他者に説明を求められたときに一応、私なりの解釈として だいたい以下のような認識でよろしいのでしょうか?
特に2は確たる情報ソースがあったわけでもないので VB6+ADOの感覚だと遅くなるイメージが払拭できません。 ちなみに現在の開発環境はVB2005にSQL Server 2000(2005ではない)なのですが その辺も関係してくる可能性があるのか、何か情報があれば教えてください。 | ||||||||||||||||||||
|
投稿日時: 2006-05-10 13:23
だったら、コネクション プーリングだとか、 メソッド間クラス間をまたぐ Connection における DataReader の注意点だとか、 "即座に閉じるべきもの" だとか、そういった書き込みも目にしているハズですが... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-05-10 13:44
さかもとです。
同じページに「複数フォームからのConnectionの共有」というスレッドがあります。 そちらが参考になるかと。 | ||||||||||||||||||||
|
投稿日時: 2006-05-10 14:27
確たる情報ソースが何かはわかりませんが パターン&プラクティスにはこんな記述がありますね http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/dnpatterns/htm/pag/scalenetchapt06.asp 信用なら無いようでしたら、ご自分で接続時間を測定してはいかがでしょうか | ||||||||||||||||||||
|
投稿日時: 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からはそうなったんだ、とそのまま受け入れ」る感じで なんとなくモヤモヤするというか… ただ、少なくとも皆さんは毎回接続・切断しているということですよね? | ||||||||||||||||||||
|
投稿日時: 2006-05-10 15:34
なぜ無効だったのかは解りませんが、プーリング自体は出来たみたいですね。 http://www.atmarkit.co.jp/fjava/devs/review03/review03_1.html
接続文字列に "Pooling=false" を入れてテストされてはどうでしょう
出来るだけ短いスコープで接続・切断をするようにしています。 | ||||||||||||||||||||
|
投稿日時: 2006-05-10 15:35
改善されたテクノロジについて、改善前の問題を持ち出されても... 「改善前は、なぜ改善されていないのか?」と言っているのと同じですね。
止まってはいないですね。(;^-^) 負荷が全く増えないわけではないですが、接続しっぱなしによる危険コストの方が高いです。
できますけど...
なんか堂々巡りになっていますね。 答えを出しても、それを疑って出発点に戻られるので、一歩も進むことができないでいます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-05-10 15:54
誤解しているのかもしれませんが・・・ ループの中で Connection の Open をするというのはループの中でOpen/Closeを繰り 返すということでしょうか? 例えば、ひとつのパターンとして、 (1)データをメモリ上に読み込む (2)メモリ上のデータを編集する (3)メモリ上のデータを書き戻す という手順がある時、(1) と (3) で接続するか、(1)で接続したものを(3)でも使う か?、ということを考えると、間違いなく前者を選ぶべきだと思います。 しかし、(1) と (3) のループ内で、接続を繰り返すことはしなくて良いと思います。
この辺りは、僕も学んだばかりのコネクションプーリングや、DataSet でググって 関連の記事を読めば、迷いはなくなると思うんですけど・・・ |