
こちらの質問にて、ODP.netでOracleをCloseした場合、その際にLANの接続が切れているなど明らかに異常の状態でもエラーはスローされないようなのですが、
ODP.netのCloseメソッドに対して、処理失敗のエラーは存在しないのでしょうか?
https://teratail.com/questions/96097?whotofollow=
逆に言えば、Oracleを明示的にCloseしないデメリットというのは何かあるのでしょうか?
例えば、システム起動と同時に接続し、システム終了時に切断させるようなシステムの場合、明示的にcloseさせる場合とさせない場合で、何か違うのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。


退会済みユーザー
2017/10/21 22:39

回答3件
0
世の習いとして、OPENしたものはきちんとCLOSEしなければなりません。
カーソルを OPEN したまま CLOSE しないと初期化パラメータ open_cursors の上限を超えるとエラーに
なります。
手を抜くことより、ちゃんと運用できるシステムを作ることを心掛けてください。
投稿2017/10/14 04:04
総合スコア16417
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/10/15 04:12

退会済みユーザー
2017/10/15 07:58

退会済みユーザー
2017/10/16 03:22

退会済みユーザー
2017/10/21 22:40

0
ベストアンサー
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/14 04:30
編集2017/10/15 04:06
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/10/21 22:40

0
不要なセッションが切断されずに残ることによるリスクとしては、同時接続数の上限に達する可能性が上がることが考えられます。
そのため、DBMSにはタイムアウト値を設定して一定期間無通信のセッションを切断する実装もあります。
また、なんらかのロックを確保したセッションが残り続け、システムの稼働に支障をきたす可能性もあるかもしれません。
ただし、もし長期的に接続し続けることに明確なリスクがあるのであれば、コネクションプーリング等は実施できないことになるものと考えられます。
ですので、同時接続数制限に達する心配がなく、クライアントからの要求を適切に返せるのでしたら問題は少ないのではないかと思います。
追記:
本件では、ネットワーク接続としてのコネクションと、Oracle Databaseとの接続であるセッションを同時に考えようとしているために複雑となっているのかもしれません。
私の説明も、クライアントとサーバー、システムとデータベース、接続やセッション、コネクション等の表記ゆれがあるため、混乱させてしまっているかもしれません。
このような場合、OSI基本参照モデルをもとに理解するとわかりやすいかもしれません。
レイヤー | レイヤー名 |
---|---|
L7 | アプリケーション層 |
L6 | プレゼンテーション層 |
L5 | セッション層 |
L4 | トランスポート層 |
L3 | ネットワーク層 |
L2 | データリンク層 |
L1 | 物理層 |
ここで、Oracle Databaseとの接続に相当するのはL5のセッション層です(たぶん)。
L6やL7は実際に発行するSQL等のことだと思って頂いて問題無いかと思います。
LANケーブルの抜線はL1の切断になります。
LANケーブルをすぐに挿し直すと、上位層でのリカバリ処理によりネットワーク接続は維持されることが期待されます。
このようなリカバリが可能なのは、上位層では接続が維持されていると認識しているためでもあります。
そのため、どちらか一方が強制的に接続を打ち切ったり、低レイヤー層でのネットワーク切断を認識できていなかったりする場合、使用されないセッションが残ってしまうということになります。
投稿2017/10/14 03:29
編集2017/10/22 01:47
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/10/21 22:40

退会済みユーザー
2017/10/21 22:56

退会済みユーザー
2017/10/22 00:42

退会済みユーザー
2017/10/22 00:59 編集

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。