- - PR -
ADO.NET 接続プールの削除
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 | ||||
|
投稿日時: 2004-11-11 10:42
ローカル変数だとは思えないので,
あと, 接続文字列に Connection Lifetime=秒数 をいれておけば, 数秒で消えると思うんですが... | ||||
|
投稿日時: 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); } | ||||
|
投稿日時: 2004-11-11 21:42
using は,アンマネージ側のリソースの解放だけれど,
コネクションプールは, ヘルプを見ると,マネージ側のSQLConnectionが 自動(automatically)で管理しているとあるので, マネージ側で,= null して, 「もう使用するつもりはないです」 と知らせてやらないといけないんじゃないかと思います。(たぶん) ※ 念のため,実験してみましたが,= null がないと確かに残ります... で,そういうものに = null を入れて見ると,消えるので, たぶん,いいんじゃないかと... [ メッセージ編集済み 編集者: 稍丼 編集日時 2004-11-11 21:45 ] | ||||
|
投稿日時: 2004-11-12 10:05
AOPPです。
わざわざ調べてもらってすみません!! おっしゃるとうりだと思います。 まだ試してません(早くやりのですが) 結果は、報告します。 | ||||
|
投稿日時: 2004-11-12 15:42
aoppです。
接続プール消えました。 sqlConnection1=null; 稍丼さんありがとうございました。 Connection Lifetime=1の時間でなく10分ぐらいで消えました。 | ||||
|
投稿日時: 2004-11-12 21:26
接続文字列に
connString = @"...;Pooling=false;..." のような感じで,Pooling=false を入れておくと, SQLConnectionの接続プール機能が無効になるので, そういう状態で,ちゃんと接続が消えるか?を確認すると, コーディングが適切かがわかるような気がします。 これでもすぐに消えない場合は, どこかで .Close していないのに,参照が切れている可能性があります。 (Connection Lifetime を,1 とかにするのならば, Pooling=false にしてプール機能は使わない方がいいかもしれません。) cf. エンタープライズマネージャの現在の利用状況で 確認している場合は,右クリックして, メニューで 最新の情報に更新 で更新する必要があります。 | ||||
|
投稿日時: 2004-11-13 20:15
AOPPです。
稍丼さんいろいろありがとうございます。 connString = @"...;Pooling=false;..." の場合 SQLSERVER側(エンタープライズマネージャ:リフレッシュ) AP側(パフォーマンスカウンタ:SqlClient#Pooledconnection) とも接続情報は、残っていませんでした。 確かに、Connection Lifetime=1は、動作状態の検証で設定しているので 業務で利用する場合は、適切な値を設定します コーディングに誤りがあるのかな!!! プールを削除するのに、SQLConnection.ConnectionString以外では、削除できないの ですかね もちろん適切に.Closeなど行っていることが前提ですけど |