- PR -

ADO.NET 接続プールの削除

投稿者投稿内容
AOPP
ベテラン
会議室デビュー日: 2002/11/18
投稿数: 66
投稿日時: 2004-11-11 00:12
AOPPです。

現在 .NET Framework Data Provider for SQL Server(C#)で作成された接続プール
を削除したいのですか、いろいろ検索してみましたがHITできなかったので質問させて
いただきます。

なぜ削除しようとしたいかと言うとDBサーバ(SQLSERVER2000)が、障害なので
再起動した場合、AP側は、DBサーバが再起動したことは分からないので、以前接続
していた接続プールを利用するので、
「ネットワークの一般エラーです。ネットワーク ドキュメントを確認してください。」
になり、エラーになった接続プールは削除対象プールとなり利用されなくなると思います。
複数の接続プールが存在する場合、
残りの接続プールも同様のエラーが発生すると思います。
(テストした感じ発生しました。正常接続するまで繰り返しました。)

IIS再起動などすれば発生しないのですが(以前接続プールを利用しないので)
C#アプリで、1回目の「ネットワークの一般エラーです。・・・」で接続プールを
削除したいと思います。
(ベストは、「ネットワークの一般エラーです。・・・」も発生させない)

試しにConnectionStringに"Min Pool Size=10”を設定してIIS再起動5回して
パフォーマンスカウンタのプール数を見たら50個いた。
削除対象プールも消えないのですね!!!!OS再起動しないと削除対象プールも消えない???MSのヘルプでは、削除対象プールは、いつか消えると記載しているのに
(30分監視)

OS:WINDOWS_XP PRO SP1



yayadon
常連さん
会議室デビュー日: 2003/07/23
投稿数: 41
投稿日時: 2004-11-11 10:42
ローカル変数だとは思えないので,

コード:

cn.Close();
cn = null;  <-- 参照をちゃんと切っていますか?


あと,
接続文字列に Connection Lifetime=秒数 をいれておけば,
数秒で消えると思うんですが...
AOPP
ベテラン
会議室デビュー日: 2002/11/18
投稿数: 66
投稿日時: 2004-11-11 13:55
AOPPです。
Connection Lifetime=1も設定していますが、消えないみたいです。
(パフォーマンスカウンターで確認)

nullがないです。
早速試してみます。
usingを使用していたので大丈夫かと思ってました。

現在**************************

internal class TEST1_TABLE1DataAccess : Component
・・・・・
try
{
sqlDataAdapter1.Fill(dataSet);
}
finally
{
sqlConnection1.Close();
}

呼び出し側
using (TEST1_TABLE1DataAccess component1 = new TEST1_TABLE1DataAccess())
{
component1.Fill(dataSet);
}
yayadon
常連さん
会議室デビュー日: 2003/07/23
投稿数: 41
投稿日時: 2004-11-11 21:42
using は,アンマネージ側のリソースの解放だけれど,
コネクションプールは,
ヘルプを見ると,マネージ側のSQLConnectionが
自動(automatically)で管理しているとあるので,
マネージ側で,= null して,
「もう使用するつもりはないです」
と知らせてやらないといけないんじゃないかと思います。(たぶん)

※ 念のため,実験してみましたが,= null がないと確かに残ります...
で,そういうものに = null を入れて見ると,消えるので,
たぶん,いいんじゃないかと...

[ メッセージ編集済み 編集者: 稍丼 編集日時 2004-11-11 21:45 ]
AOPP
ベテラン
会議室デビュー日: 2002/11/18
投稿数: 66
投稿日時: 2004-11-12 10:05
AOPPです。

わざわざ調べてもらってすみません!!
おっしゃるとうりだと思います。

まだ試してません(早くやりのですが)
結果は、報告します。
AOPP
ベテラン
会議室デビュー日: 2002/11/18
投稿数: 66
投稿日時: 2004-11-12 15:42
aoppです。

接続プール消えました。
sqlConnection1=null;
稍丼さんありがとうございました。


Connection Lifetime=1の時間でなく10分ぐらいで消えました。

yayadon
常連さん
会議室デビュー日: 2003/07/23
投稿数: 41
投稿日時: 2004-11-12 21:26
接続文字列に

connString = @"...;Pooling=false;..."

のような感じで,Pooling=false を入れておくと,
SQLConnectionの接続プール機能が無効になるので,
そういう状態で,ちゃんと接続が消えるか?を確認すると,
コーディングが適切かがわかるような気がします。
これでもすぐに消えない場合は,
どこかで .Close していないのに,参照が切れている可能性があります。

(Connection Lifetime を,1 とかにするのならば,
Pooling=false にしてプール機能は使わない方がいいかもしれません。)


cf.
エンタープライズマネージャの現在の利用状況で
確認している場合は,右クリックして,
メニューで 最新の情報に更新 で更新する必要があります。
AOPP
ベテラン
会議室デビュー日: 2002/11/18
投稿数: 66
投稿日時: 2004-11-13 20:15
AOPPです。

稍丼さんいろいろありがとうございます。

connString = @"...;Pooling=false;..." の場合
SQLSERVER側(エンタープライズマネージャ:リフレッシュ)
AP側(パフォーマンスカウンタ:SqlClient#Pooledconnection)
とも接続情報は、残っていませんでした。

確かに、Connection Lifetime=1は、動作状態の検証で設定しているので
業務で利用する場合は、適切な値を設定します

コーディングに誤りがあるのかな!!!
プールを削除するのに、SQLConnection.ConnectionString以外では、削除できないの
ですかね
もちろん適切に.Closeなど行っていることが前提ですけど


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