- PR -

DBコネクションのOPENとCLOSEのタイミング

1
投稿者投稿内容
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 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したほうが、
開いたり閉じたりする回数が少なくていいのでしょうか?

皆さんの意見を聞きたいと思います。

よろしくお願いします。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2004-03-19 16:03
どもも。がると申します。
.NETに詳しいわけではないのですが。

通常、DBのopenやcloseは結構コストの高い処理になることが
多いです。で、その観点からすると
・プログラムの先頭付近でopen、終了付近でclose
程度にして、open/closeの回数を減らすほうが好ましいのが
通例かと思います。

.NET特有の部分は他の方に譲るとして。基本的には上記の考え方
が割と多いかと思います。

以下余談:
ちなみに言語とかによっては「openしたハンドルを保持しっぱなし」
が可能なので(servletとかFCGIとか)、そういう時はプロセスの起動時
にopenしてあとはずっとハンドルを持ちまわる、って方法もあります。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-19 16:04
 たいていの場合、使う直前にopenし、使い終わった直後にcloseします(書いていらっしゃるとおり)。


> これだと開いたり閉じたりが繰り返されることになる
 データベースとアクセスするのは、プログラム自身ではなく、データプロバイダと呼ばれるミドルウェアです。このデータプロバイダは、
  データベース←1→データプロバイダ←2→プログラム
のように、プログラムとデータベースの間に入ります。System.Data.SqlClientや、System.Data.OleDb名前空間で使うのは、このプロバイダへアクセスするためのクラスです。
 たいていのデータプロバイダは、「接続プール」というものを持っています。これにより、プログラムからの指示で切れるのは(2)の部分で、実際にはデータベースへの接続が切れるわけではありません。データプロバイダに対して同じ接続の要求があると、2の部分だけを、つなぎます。もっとも、他のところで1がつながったままなら、1もつなぎなおします。
(多少強引ですので、このままを信じないでください)
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-03-19 16:31
がるがるさん、Jittaさんありがとうございます。
大変参考になりました。

引用:

Jittaさんの書き込み (2004-03-19 16:04) より:
 たいていのデータプロバイダは、「接続プール」というものを持っています。これにより、プログラムからの指示で切れるのは(2)の部分で、実際にはデータベースへの接続が切れるわけではありません。データプロバイダに対して同じ接続の要求があると、2の部分だけを、つなぎます。もっとも、他のところで1がつながったままなら、1もつなぎなおします。
(多少強引ですので、このままを信じないでください)



http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.asp
をみて、接続プールについて調べてみました。
複数DBへの接続を行う場合については、大体の場合において
開いたり閉じたりしたほうが良いんだなと理解できました。
ちなみに、1つのDBにしか接続しない場合はどうなのでしょうか?
例えば単純なマスタメンテのように1つのDBに対して「追加・更新・削除」のみを行う場合は、
それぞれの処理毎に開いたり閉じたりするのは意味がないような気がするので、
そのような場合はがるがるさんが言うように、最初の方で開いて、最後の方で閉じるのが良いような気がします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-19 17:12
 私は「使う前後で開いて閉じる」としか設計したことがないので。組み込みSQLなどでは、「つなぎっぱなし」とかもするのかな?

長くなりますが・・・
引用:

ADO.NET 接続デザインツールの概要より:
接続の確立と終了
接続において重要な 2 つのメソッドとして、Open メソッドと Close メソッドがあります。Open メソッドは、ConnectionString プロパティの情報を使用してデータ ソースにアクセスし、接続を確立します。Close メソッドは、接続を終了します。ほとんどのデータ ソースでは同時に確立できる接続の数が限られており、また確立された接続は貴重なシステム リソースを使用するため、接続の終了は重要です。

データアダプタまたはデータ コマンドを使用している場合は、接続を明示的に確立または終了する必要はありません。これらのオブジェクトのメソッド (たとえば、データアダプタの Fill メソッドや Update メソッドなど) を呼び出すと、接続が既に確立されているかどうかをメソッドが確認します。確立されていない場合は、アダプタが接続を確立し、ロジックを実行し、接続を終了します。

Fill などのメソッドが接続の確立と終了を自動的に行うのは、接続が確立されていない場合だけです。接続が確立されている場合、メソッドはその接続を使用しますが、接続を終了しません。これにより、ユーザーが自分自身でデータ コマンドを開いたり閉じたりできる柔軟性が得られます。複数のデータアダプタで 1 つの接続を共有している場合は、このような操作が必要です。この場合、Fill メソッドを呼び出すたびにそれぞれのアダプタが接続を確立して終了するのは非効率的です。代わりに、最初に接続を確立してから、各アダプタの Fill メソッドを呼び出し、最後に接続を終了できます。



重要なのは「接続したままいなくなる」ことがないようにすることです。私が「使用する前後で〜」なのは、接続を確実に閉じられる(閉じる)からです。
 これについては、「接続可能数」が重要な要素となります。想定される接続要求に対して、「接続可能数」が十分にあるなら、アプリケーションの最初に接続し、アプリケーションの最後に閉じることも可能です。
 アプリケーションの最初と最後について、Windowsアプリケーションならば、アプリケーションの「開始」と「終了」を明確に知ることができます。が、Webアプリケーションでは、ちょっと勝手が違ってきます。実行についても、同時に多人数がアクセスできることも、考慮しなければなりません。トランザクションを使って、データの変更を「取り消す」ことがあるならなおさらです。


 その辺の事情を考えながら、設計する必要があるのではないでしょうか。
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-03-19 17:21
そうですね。確かに確実に閉じることが大切ですね。
これについては、それぞれの案件によって正解がまちまちだと思いますので
使用するDBはもちろん言語、プラットフォームなどの環境を踏まえて
ベストな設計を考えるのが重要ですね。
また、今回の意見は基本的な仕様として大変参考になりました。
ありがとうございます。
1

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