質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.03%

  • Oracle

    515questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracleとの接続は明示的にCloseしない場合にどんなデメリットがあるのでしょうか?

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 892

ogura87

score 81

こちらの質問にて、ODP.netでOracleをCloseした場合、その際にLANの接続が切れているなど明らかに異常の状態でもエラーはスローされないようなのですが、

ODP.netのCloseメソッドに対して、処理失敗のエラーは存在しないのでしょうか?
https://teratail.com/questions/96097?whotofollow=

逆に言えば、Oracleを明示的にCloseしないデメリットというのは何かあるのでしょうか?

例えば、システム起動と同時に接続し、システム終了時に切断させるようなシステムの場合、明示的にcloseさせる場合とさせない場合で、何か違うのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/10/14 13:35

    closeでlanの接続を検知しなければならない理由があればそれも質問に書いていただけませんか?

    キャンセル

  • ogura87

    2017/10/22 07:39

    すいません。質問の仕方が悪かったようです。私が知りたかったのは、LAN切断やシステム終了時はcloseしなくても、自動的に切断されるかどうかだったんです。このスレッドいったん終了して別スレッド立てます。

    キャンセル

回答 3

checkベストアンサー

+1

Closeしないとconnectionリーク(connection poolのconnectionの枯渇)が起こりやすくなります。結果、DBに接続できないということになります。webアプリで多数のユーザーが同時アクセスするようなケースではどうなるかを考えれば、必ずCloseするという結論になるかと思いますが?

【追伸】

SQL Server / SqlClient の場合ですが、connection リーク防止のため必ず Close する、そのためにはどういうコードを書くべきかの記事を紹介しておきます。

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

Oracle / ODP.NET の場合でも、ADO.NET の基本を守って ODP.NET が実装されていれば、同じことが当てはまるはずです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/22 07:40

    ごめんなさい。質問の仕方が悪かったようです。私が知りたかったのは、LAN切断やシステム終了時はcloseしなくても、自動的に切断されるかどうかだったんです。このスレッドいったん終了して別スレッド立てます。

    キャンセル

0

不要なセッションが切断されずに残ることによるリスクとしては、同時接続数の上限に達する可能性が上がることが考えられます。
そのため、DBMSにはタイムアウト値を設定して一定期間無通信のセッションを切断する実装もあります。
また、なんらかのロックを確保したセッションが残り続け、システムの稼働に支障をきたす可能性もあるかもしれません。

ただし、もし長期的に接続し続けることに明確なリスクがあるのであれば、コネクションプーリング等は実施できないことになるものと考えられます。
ですので、同時接続数制限に達する心配がなく、クライアントからの要求を適切に返せるのでしたら問題は少ないのではないかと思います。


追記:

本件では、ネットワーク接続としてのコネクションと、Oracle Databaseとの接続であるセッションを同時に考えようとしているために複雑となっているのかもしれません。
私の説明も、クライアントとサーバー、システムとデータベース、接続やセッション、コネクション等の表記ゆれがあるため、混乱させてしまっているかもしれません。

このような場合、OSI基本参照モデルをもとに理解するとわかりやすいかもしれません。

OSI参照モデル - Wikipedia

レイヤー レイヤー名
L7 アプリケーション層
L6 プレゼンテーション層
L5 セッション層
L4 トランスポート層
L3 ネットワーク層
L2 データリンク層
L1 物理層

ここで、Oracle Databaseとの接続に相当するのはL5のセッション層です(たぶん)。
L6やL7は実際に発行するSQL等のことだと思って頂いて問題無いかと思います。

LANケーブルの抜線はL1の切断になります。
LANケーブルをすぐに挿し直すと、上位層でのリカバリ処理によりネットワーク接続は維持されることが期待されます。
このようなリカバリが可能なのは、上位層では接続が維持されていると認識しているためでもあります。
そのため、どちらか一方が強制的に接続を打ち切ったり、低レイヤー層でのネットワーク切断を認識できていなかったりする場合、使用されないセッションが残ってしまうということになります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/22 07:40

    ごめんなさい。質問の仕方が悪かったようです。私が知りたかったのは、LAN切断やシステム終了時はcloseしなくても、自動的に切断されるかどうかだったんです。このスレッドいったん終了して別スレッド立てます。

    キャンセル

  • 2017/10/22 07:56

    DBMSが接続断を認識していなければDB側にはセッションが残ったままとなります。
    クライアント側(システム等)のコネクションは無くなっている場合と、そうではない場合があります。システム終了時はシステム側は接続を一方的になくしているかもしれませんが、ネットワーク切断時はDBMSとの通信が発生するまでは、システム側、DBMS側ともに、お互いに接続は維持されていると判断するでしょう。

    キャンセル

  • 2017/10/22 09:42

    なるほど。難しいですね。。。
    DBMS側としては、そうなった時の為のごみセッションのクリーニングなどが必要という事なのでしょうか。。。

    キャンセル

  • 2017/10/22 09:59 編集

    はい、そのためにセッションタイムアウト値が設定されています。
    前述とは逆に、クライアント側はコネクションが継続していると思っていても、データベース側ではセッションを破棄している場合もあります。他にもネットワーク経路上にあるFW等のネットワーク機器によるセッション切断も発生し得ます。
    このような場合には、Oracle DBとの接続であれば通信時にORA-03113やORA-03135といったエラーが発生することになります。

    キャンセル

-2

世の習いとして、OPENしたものはきちんとCLOSEしなければなりません。
カーソルを OPEN したまま CLOSE しないと初期化パラメータ open_cursors の上限を超えるとエラーに
なります。

手を抜くことより、ちゃんと運用できるシステムを作ることを心掛けてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/15 13:12

    ストアドに使うカーソルのことを言っておられるのですか?

    質問は ODP.NET の OracleConnection を Open した後 Close しないとどういうデメリットがあるかということなのですが、カーソルとどういう関係があるのでしょう?

    キャンセル

  • 2017/10/15 15:30

    カーソルはストアド以外にも使われます。V$OPEN_CURSOR などの動的パフォーマンス・ビューを覗いてみると、あれえ?何これ?っていろいろ発見があります。
    OracleConnection を CLOSE しないと V$SESSION の幽霊セッションとして残ることが考えられますから、 初期化パラメータ sessions を超えてしまい、 ALTER SYSYTEM KILL SESSION ... が必要にかもしれません。
    最近は何か月も稼働を続けなければならないシステムも多いですから、shutdownしなければならなくなると障害として扱われ、お客様からクレームを受けることもあるのでご注意を。

    キャンセル

  • 2017/10/15 16:58

    質問者さんのケースは「ODP.NET」←→「LAN 等の通信路」←→「Oracle」という構成で、OracleConnection.Close は ODP.NET 側に限った話のはずです。

    Orlosky さんの言われるカーソルというのが理解できていませんが、それは Oracle 内部に限った話ではないのでしょうか?

    私のレスで紹介した記事「.NETの例外処理 Part.2」の図を見てください。記事は SQL Server + SqlClient の話ですが、たぶん Oracle + ODP.NET も同様に、OracleConnection の Open / Close は ODP.NET 側にある Connection Pool にある Connection の貸し出し / 戻しを行うのみで、DB サーバー側には何も影響を与えないと思います。

    キャンセル

  • 2017/10/16 12:18

    質問者さんのケースは差支えなければ OracleConnection.Open しとた時とOracleConnection.Close後のV$OPEN_CURSORのSID,SERIAL, MACHINE, STATUS, PROGRAM 列を確認していただけますか?
    たしかに、この質問ではカーソルはあまり適切ではありませんね。
    カーソルをOPENしたままCLOSEを故意に省略するモラルのない人が残念ながら少なくないです。EXCEPTIONでカーソルがOPENされていたらCLOSEする記述も漏れていることもしばしば。

    キャンセル

  • 2017/10/16 12:22

    > 確認していただけますか?

    ご自分で確認した結果を書いていただくようお願いします。

    キャンセル

  • 2017/10/16 14:29

    ODP.NET環境を用意していません。

    キャンセル

  • 2017/10/22 07:40

    ごめんなさい。質問の仕方が悪かったようです。私が知りたかったのは、LAN切断やシステム終了時はcloseしなくても、自動的に切断されるかどうかだったんです。このスレッドいったん終了して別スレッド立てます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Oracle

    515questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。