- PR -

[ASP.NET] GC.Collectの多用

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-07-27 22:02
大丈夫だと思うけど、一応、補足として書いておきます。
引用:

COM ラッパ オブジェクトが '未到達' になれば、回収されます。


「回収される」ことと、このケースの場合の「Oracleとのセッションがなくなりません」は、別の問題です。
たまたま、oo4o が、回収されるときに Oracle のセッションを切断するように作ってあった、だけのことです。
クラスを作る場合は、そのように作る必要があります、ともいえます。


アプリケーション ドメインがリスタートされることとかを考えると、あまり良い作りではないですね。
認証の設定を変えたら、15秒程度かかる初期起動が1秒未満で終わったりして(Oracle も、Windows 認証がデフォルトですから)


 スタック トレースって、行番号が出ないんだっけ?
転記したときに消すのはいいけど、どの行で発生したかがわかれば、どれが null なのか、わかるんだけど?


セッション オブジェクトが消えないのは、これでしょう→http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32241&forum=7&6
(暗黙の型変換による、多重参照)

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-07-27 22:03 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-27 23:19
引用:

Jittaさんの書き込み (2006-07-27 22:02) より:

「回収される」ことと、このケースの場合の「Oracleとのセッションがなくなりません」は、別の問題です。


でしょうね、私もそういうつもりで書いたわけではないです。
ただし、

引用:

セッション オブジェクトが消えないのは、これでしょう→
(暗黙の型変換による、多重参照)


自分で書いておきながら、この可能性を考えていなかったのは認めます... orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-07-27 23:41
引用:

どういう状況を想定していますか?

Application変数がNullになる可能性としては、
1.Application_Startの初期化処理自体で失敗
2.誰かが勝手に消した


どちらも想定していますね。

「ここは絶対 null はあり得ない」という状況なら尚更チェックして例外スローです。そうしないから「オブジェクト参照がオブジェクト インスタンスに設定されていません」という原因の掴みにくい状況になるわけです。

引用:

 スタック トレースって、行番号が出ないんだっけ?
転記したときに消すのはいいけど、どの行で発生したかがわかれば、どれが null なのか、わかるんだけど?


出ないですね。デバッグ情報があるときなのかな?とにかくデバッグビルドしていたら行番号も出ます。
_________________
囚人のジレンマな日々
未記入
会議室デビュー日: 2005/06/22
投稿数: 8
投稿日時: 2006-07-28 18:18
みなさん色々とありがとうございます。

Application("OraSession")がNullになったのが原因で今回のエラーにつながった
かは未だ不明なのですが、可能性としてはあると思い毎回チェックを入れる処理
を暫定的に入れる事にしました。

デバッグビルドでは行番号は取得できますが、仮にApplication("OraSession")が
Nullであると言う事が原因だった場合、“なぜNullになったのか?”という所が
追求できないので、システムのリメイクまで暫定的に上記の方法で回避を試みます。
Global.asaxのApplication_BeginRequestとApplication_Errorに入れようと
しています。
(そこでまた同じ事象が発生すればまた別の話になってしまいますが・・・。)

今回の質問で遅延バインディングやMarshal.ReleaseComObjectの意味等が
勉強できました。みなさんありがとうございました。

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