DOBON.NET DOBON.NETプログラミング掲示板過去ログ

接続プールについて

環境/言語:[WindowsXP VB.NET ADO SQLServer2008]
分類:[.NET]

初めて質問させていただきます。

検索したのですが回答が得られなかったため、質問させていただきます。
初心者故分かりにくい表現や的外れなことを書いている可能性がありますが、
どうぞ宜しくお願いいたします。

現在、VB.NETでSQLServerにリストアするプログラムを作成しています。
コードは以下のような感じです。

##################################################################
Public con As ADODB.Connection

<略>

con.Open(接続文字列)

con.Close()  '(1)
con = Nothing

<略>

Shell(リストアsqlcmd) '(2)
##################################################################

(2)でリストアを実行すようとすると、排他エラーとなってしまいます。
接続プールが削除されるまでに少々時間がかかっているようです。

ADOの場合、接続プールを削除するにはどのようにしたらいいのでしょうか?
もしかしたら、他に原因があるのでしょうか?

お手すきの際にご回答いただければ幸いです。
どうぞ宜しくお願いいたします。
■No28369に返信(かこさんの記事)

VB.NETなら
System.Data.SqlClientの
SqlConnectionを使用したほうが良いかと思います。
一応 SqlConnectionにClearAllPoolsというのがあるのでそれで接続プールを
クリアできます。
shu 軍団さん、早々の返信ありがとうございます。

System.Data.SqlClientを使用したいのはやまやまなのですが、
共通クラスにADODB.Connectionを定義してあるため、
これを使用しないと駄目なのです。

ご回答、ありがとうございました。
2011/04/01(Fri) 00:26:08 編集(投稿者)

■No28369に返信(かこさんの記事)

ADODB.Connection オブジェクトのリソースが関係していないですかね。
.NET Framework で ADODB を使う場合には、Nothing を代入する前に Marshal.Relea
seComObject を呼び明示的に参照カウントを減らす必要があります。こんな感じにし
てみてはいかがでしょうか。

Try
  con = New ADODB.Connection()
  Try
    con.Open()
    ...
  Finally
    con.Close()
  End Try
Finally
  If Not (con Is Nothing) Then
    Marshal.ReleaseComObject(con)
    con = Nothing
  End If
End Try
もりおさん 様

ご回答ありがとうございます。
Marshal.ReleaseComObjectを使用したところ、削除することができました。
Marshal.ReleaseComObjectメソッドは、指定したオブジェクトに関連する参照
(この場合なら接続プール)も開放するという認識で良いのでしょうか?

マネージリソース、アンマネージリソース、GCなど、
自分はまだまだ理解していない点がたくさんあると再認識できました。
勉強あるのみです・・・。

どうもありがとうございました。
解決済み!
  • 題名: Re[3]: 接続プールについて
  • 著者: もりお
  • 日時: 2011/04/02 3:58:22
  • ID: 28393
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2011/04/02(Sat) 03:59:54 編集(投稿者)

■No28389に返信(かこさんの記事)
> Marshal.ReleaseComObjectメソッドは、指定したオブジェクトに関連する参照
> (この場合なら接続プール)も開放するという認識で良いのでしょうか?

ADODB.Connection オブジェクトが、排他エラーを引き起こすリソースを保持してい
て、Marshal.ReleaseComObject を呼んだことで ADODB.Connection オブジェクトの
参照カウントが0になって、ADODB.Connection オブジェクトのデストラクタが呼ばれ
たことで、排他エラーを引き起こすリソースが開放されたということなんでしょうけ
れども、排他エラーを引き起こすリソースが接続プールなのかどうかはわたしにはわ
かりません。なので Marshal.ReleaseComObject で接続プールが開放されるのかはわ
かりません。

接続プールというのは OLE DB や ODBC といったプロバイダーによっても変わってく
るのですかね。接続プールの状態を確認するすべをなにかご存知ではないですか?と
逆に質問してみたり。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板