- - PR -
DBコネクションのOPENとCLOSEのタイミング
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-03-19 15:34
WebMatrix0.6を使ってASP.NET(Page Language="VB")開発をしています。
今日でASP.NETをはじめて3日目ですが、ちょっとした疑問があります。 DBはMSDEを使用していますが、DBへのコネクションをOPEN/CLOSEするタイミングは どのようにするといいのでしょうか? DBに対して何らかの更新を行う直前にコネクションをOPENして、処理が終わった直後に CLOSEするのが良いのでしょうか? ただ、これだと開いたり閉じたりが繰り返されることになるのが気になります。 それとも、Page_LoadサブなどでOPENして、区切りのいいところでCLOSEしたほうが、 開いたり閉じたりする回数が少なくていいのでしょうか? 皆さんの意見を聞きたいと思います。 よろしくお願いします。 | ||||
|
投稿日時: 2004-03-19 16:03
どもも。がると申します。
.NETに詳しいわけではないのですが。 通常、DBのopenやcloseは結構コストの高い処理になることが 多いです。で、その観点からすると ・プログラムの先頭付近でopen、終了付近でclose 程度にして、open/closeの回数を減らすほうが好ましいのが 通例かと思います。 .NET特有の部分は他の方に譲るとして。基本的には上記の考え方 が割と多いかと思います。 以下余談: ちなみに言語とかによっては「openしたハンドルを保持しっぱなし」 が可能なので(servletとかFCGIとか)、そういう時はプロセスの起動時 にopenしてあとはずっとハンドルを持ちまわる、って方法もあります。 | ||||
|
投稿日時: 2004-03-19 16:04
たいていの場合、使う直前にopenし、使い終わった直後にcloseします(書いていらっしゃるとおり)。
> これだと開いたり閉じたりが繰り返されることになる データベースとアクセスするのは、プログラム自身ではなく、データプロバイダと呼ばれるミドルウェアです。このデータプロバイダは、 データベース←1→データプロバイダ←2→プログラム のように、プログラムとデータベースの間に入ります。System.Data.SqlClientや、System.Data.OleDb名前空間で使うのは、このプロバイダへアクセスするためのクラスです。 たいていのデータプロバイダは、「接続プール」というものを持っています。これにより、プログラムからの指示で切れるのは(2)の部分で、実際にはデータベースへの接続が切れるわけではありません。データプロバイダに対して同じ接続の要求があると、2の部分だけを、つなぎます。もっとも、他のところで1がつながったままなら、1もつなぎなおします。 (多少強引ですので、このままを信じないでください) | ||||
|
投稿日時: 2004-03-19 16:31
がるがるさん、Jittaさんありがとうございます。
大変参考になりました。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.asp をみて、接続プールについて調べてみました。 複数DBへの接続を行う場合については、大体の場合において 開いたり閉じたりしたほうが良いんだなと理解できました。 ちなみに、1つのDBにしか接続しない場合はどうなのでしょうか? 例えば単純なマスタメンテのように1つのDBに対して「追加・更新・削除」のみを行う場合は、 それぞれの処理毎に開いたり閉じたりするのは意味がないような気がするので、 そのような場合はがるがるさんが言うように、最初の方で開いて、最後の方で閉じるのが良いような気がします。 | ||||
|
投稿日時: 2004-03-19 17:12
私は「使う前後で開いて閉じる」としか設計したことがないので。組み込みSQLなどでは、「つなぎっぱなし」とかもするのかな?
長くなりますが・・・
重要なのは「接続したままいなくなる」ことがないようにすることです。私が「使用する前後で〜」なのは、接続を確実に閉じられる(閉じる)からです。 これについては、「接続可能数」が重要な要素となります。想定される接続要求に対して、「接続可能数」が十分にあるなら、アプリケーションの最初に接続し、アプリケーションの最後に閉じることも可能です。 アプリケーションの最初と最後について、Windowsアプリケーションならば、アプリケーションの「開始」と「終了」を明確に知ることができます。が、Webアプリケーションでは、ちょっと勝手が違ってきます。実行についても、同時に多人数がアクセスできることも、考慮しなければなりません。トランザクションを使って、データの変更を「取り消す」ことがあるならなおさらです。 その辺の事情を考えながら、設計する必要があるのではないでしょうか。 | ||||
|
投稿日時: 2004-03-19 17:21
そうですね。確かに確実に閉じることが大切ですね。
これについては、それぞれの案件によって正解がまちまちだと思いますので 使用するDBはもちろん言語、プラットフォームなどの環境を踏まえて ベストな設計を考えるのが重要ですね。 また、今回の意見は基本的な仕様として大変参考になりました。 ありがとうございます。 |
1