- PR -

[ASP.NET]ASP.NET+oo4oでオラクルのセッションが切れない

投稿者投稿内容
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 2003-05-30 22:10
いつも拝見しています。

ASP.NET(VB.NET) + oo4oでWebアプリを作成しています。
OracleへのアクセスやDBの操作は問題なくできるのです
が、セッションがきれないのです。

-----------------------------
OraSession = 〜
OraDatabase = Orasession.〜
Try
(中略)
Catch exp As Exception
OraDatabase = Nothing
OraSession = Nothing
Finally
  (中略)
OraDatabase = Nothing
OraSession = Nothing
End try
-------------------

実際のコードは上記です。
みなさんは同じ現象おきていますでしょうか?
(そもそもoo4oは使用していないのかな?)
Dispose()を使用(または併用)していますでしょうか?

ご教授ください。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2003-05-31 00:38
oo4oは使用していませんが、コネクションプーリングが有効になっているとかでは?

oo4oのヘルプで「コネクションプーリング」「connection pooling」で調べてみると答えがあるかも。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-06-02 10:52
こんにちは。

 Nothingをしただけでは、メモリは解放されません。@ITの記事に『確実に解放するには』みたいなものがあったと思います。参考にしてください。この場合、nothingではなく、コネクションの切断を行う必要があります(+、ラフィンさんのプーリング設定)。

 あと、Try〜catch〜finallyで、catch句とfinally句の両方でnothingされていますが、finally句は必ず実行されるので、catch句の方は不要です。
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 2003-06-02 11:46
ラフィンさん、Jittaさんありがとうです。

コネクションプーリング調べたのですが英語ばっかりでまったく
わかりませんでした。

VB6.0をしてった時はNothingでセッションが切れていたのに
VB.NETではだめみたいです。

コネクションとセッションの適切な切り方を教えてください。
よろしくお願いします。
NothingButXMLInfoSet
ベテラン
会議室デビュー日: 2003/03/31
投稿数: 65
投稿日時: 2003-06-02 12:22
MarshalクラスのReleaseComObjectメソッドについて調べてみるとヒントが見つかるかもしれません。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2003-06-02 14:42
役に立たないと思いますが、ODP.Netのコネクションプーリングの制御方法

★プーリングに制限を加える際はConnectStringで調整する。

Pooling=true/false
 コネクションプーリングの使用(デフォルト=true)
Connection Lifetime
 プーリングの削除判断時間(デフォルト=0秒)
Connection Timeout
 プーリングからの接続タイムアウト(デフォルト=15秒)
Max Pool Size
 最大プール数(デフォルト=100)
Min Pool Size
 最小プール数(デフォルト=1)
Incr Pool Size
 プールが足りない場合の増分(デフォルト=5)
Decr Pool Size
 プールが使われていない際の減少分(デフォルト=1)


※なお、セッションが切れないのとコネクションプーリングがセッションを確保しているのはイコールではありませんので...

ODP.Netでコネクションに対してNothingをセットする前にCloseしています。
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 2003-06-02 22:00
みなさんありがとうです。

imports System.Runtime.InteropServices

OraSession = CreateObject(〜
OraDatabase = Orasession.〜
Try
(中略)
Catch exp As Exception
OraDatabase = Nothing
OraSession = Nothing
'ここでエラーページへ遷移
Finally
  (中略)
Marshal.ReleaseComObject(OraDatabase)
OraDatabase = Nothing
Marshal.ReleaseComObject(OraSession)
OraSession = Nothing

でセッションが切断されたのを確認したのですが、
すべてではないようです。いくつかはセッションが
残ってしまいます。ラフィンさんのコネクション
プーリングなのかこの方法では完全ではないのか
判断がなかなかつきかねています。

そもそもReleaseComObjectをしたあとにオブジェクト
の解放をするのか?それともオブジェクトをクリエイト
(インクリメントとも書いてました)をしないと
いけないのか?はたまたSecurityPermissionでアクセス
許可を設定しないのいけないのか??
などなど奥がだんだん深まっています。
上記のコードで完全ではない理由はどこなのでしょうか。
ご教授ください。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2003-06-03 00:35
oo4oのヘルプをパッっと見た感じでは、コネクションプーリングは明示的に定義しない限り有効にならないようにみえました。(断言しません)

奥が深まっているとお感じでしたら一旦浅くしてみてはいかがでしょう。
例えば
OraSession = CreateObject(〜
OraDatabase = Orasession.〜
OraDatabase = Nothing
OraSession = Nothing
この4行だけをブレークポイントなんぞ設定せずに連続10回でも動かして見るとか。
(中略)いりませんしね。

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