QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

オラクルのコネクションが残ってしまう

ASP.NET(VB.NET) + ORACLEのWEBアプリでコネクションが切れなくて困っています。

ASPのセッション開始時に、ORACLEとコネクションを張って、そのコネクションを
セッション変数に格納して使いまわし、セッション終了時に

SESSION("ORA_CON").CLOSE
SESSION("ORA_CON").DISPOSE
SESSION("ORA_CON") = NOTHING

とやっているんですが、 SQL*PLUS で v$session ビューを見ると
いつまでたってもコネクションが残ったままです。(statusはinactive)

接続プールがあるにしても、一日以上もなくならず、IISの再起動をしないと
なくなりません。

開放の仕方が間違っているのでしょうか?

***************************************
WEB サーバ
  W2K SERVER SP3
IIS5.0
.NET FRAMEWORK 1.1
    ASPからDBへの接続:ODP.NET (ORACLE社のサイトからダウンロード)
DB サーバ
  ORACLE8.0.5

質問者:おきくあきー

回答

セッションが切れていますでしょうか。
つまり、そのソースの部分が確かに実行されていることを確認してみてください。

あと、開きっぱなしって、あまりやらないと思うんですが・・・。
DB周りはあまり良く分からないのですが、コネクションがプールされるというならなおさら、プログラムでは一回ごとにきちんとクローズするべきだと思います。

投稿者:一郎

編集 履歴 (0)

おきくあきーさんの書き込み (2004-01-08 14:43) より:

ASPのセッション開始時に、ORACLEとコネクションを張って、

そのコネクションをセッション変数に格納して使いまわし、

 そもそもこれがおかしいでしょう。
コネクションプーリングを行い、
DBのコネクションは1リクエストごとにコネクションプールから取得し、
処理が終了したらコネクションプールにコネクションを返却すべきですね。
HTTPがステートレスな通信なのに、
DBのコネクションだけ常に接続されているのは,
おかしいと思いませんかね・・・。
 私は.NETは未経験というかMS系は殆ど知らないので、
これぐらいしか回答できませんが。

投稿者:taku

編集 履歴 (0)

早速のレスありがとうございます。

①コネクションを切るコードの部分を通っているかについて
  →デバックしてみましたが、通っており、その後コネクションのstate
を見てもcloseになっています

②コネクションの使いまわしについて
  →ご指摘の通り、普通は絶対にこんなことやらないと思います。
   アプリをつくり始めた段階では接続プールの存在をしらず、
   コネクションをつなぎっぱなしにしてパフォーマンスをあげる
   目的でこのようにしたようです。

   やはりやり方を変えるしかないのですかね・・・

ちなみに、
   接続POOLの無効化は、接続文字列の部分に
「 Pooling = false; 」
   として、試しましたが、効果がありませんでした。

   

投稿者:おきくあきー

編集 履歴 (0)

皆様
ありがとうございました。

結局、DBとの接続を考え直すこととなりました。

アドバイスありがとうございました。
それにしても、.NET − SQLサーバ間と同じくらいの接続パフォーマンス
だと助かるんですけどね。
(接続プールがあるからよいのでしょうが・・・)

投稿者:おきくあきー

編集 履歴 (0)

sqlnet.oraのパラメータ
SQLNET.AUTHENTICATION_SERVICES= (NONE)

当然やっていますよね?
(Windows統合認証を使わない場合)
[ メッセージ編集済み 編集者: Jitta 編集日時 2004-01-09 12:14 ]

投稿者:Jitta

編集 履歴 (0)

Jittaさんからご指摘いただいた

sqlnet.oraのパラメータ
SQLNET.AUTHENTICATION_SERVICES= (NONE)

以上のパラメータを設定してORACLEを再起動しましたがそれでもだめでした。
さらに、

SQLNET.ORAにSQLNET.EXPIRE_TIME=1 

も設定してみましたがだめでした・・・

投稿者:おきくあきー

編集 履歴 (0)

はにまるです。

的外れかもしれませんが、
PL/SQLを利用している場合、カーソルを閉じずにプログラムを終了すると
カーソルがオープン状態なままメモリに残る問題があります。

もしかすると、Session情報も残るのかもしれません。

投稿者:はにまる

編集 履歴 (0)

おきくあきーさんの書き込み (2004-01-13 18:16) より:

sqlnet.oraのパラメータ

SQLNET.AUTHENTICATION_SERVICES= (NONE)

以上のパラメータを設定してORACLEを再起動しましたがそれでもだめでした。

違います。これは、
『.NET − SQLサーバ間と同じくらいの接続パフォーマンスだと助かるんですけどね。』
に対して、です。最初の接続もあっという間に終わるようになったはずです(NTSで、Windowsにログオン中のユーザと同じユーザが登録されていなければ5秒程度かかる)。

 データベースコネクションに関しては、他のスレッドにもあるように、オープンしたままで使い回すべきではありません。接続情報はプールされるので、使う直前で開き、使い終わったらすぐ閉じる、というのが基本です。

 なお、ODP.NETは、プーリングにバグがあるらしいので、Oracleのホームページの情報をチェックしてください。

投稿者:Jitta

編集 履歴 (0)

WindowsレジストリでTCP/IPのKeepAliveTime値を設定されてみてはどうでしょうか。

投稿者:ももんが

編集 履歴 (0)

皆様ありがとうございます

Windowsのレジストリ Keep Alive Timeを設定してもだめでした。

現在は、セッション変数に格納したコネクションを、各画面(ASPファイル)
にコピーしている部分で、コネクションが切れていない(切り忘れ)所を
全ソースをもう一度洗いなおし中です。

投稿者:おきくあきー

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。