C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: Oracleコネクションの持ち方について


(過去ログ 40 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■20760 / inTopicNo.1)  Oracleコネクションの持ち方について
  
□投稿者/ TK (3回)-(2008/06/15(Sun) 02:34:19)

分類:[VB.NET/VB2005] 

はじめまして。
WindowsアプリでのOracleコネクションについて質問がありますので、どうかよろしくお願いします。
環境は、WindowsXP、VB.NET2005、Oracle10gを使用しています。
長文かつわかりにくいかもしれませんが、どうかよろしくお願いします。

Oracleへの接続なんですが、毎回接続しても問題ないのでしょうか?

今までWebアプリの開発しか行っていません。
そこでは、submit後のページロードで常にOracle接続処理を記述していました。
【例】
--------------------------------------------------------
Dim connectionString As String = "接続文字列"
Dim connection As New OracleConnection(connectionString)

Try
connection.Open()
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
--------------------------------------------------------

Windowsアプリの場合です。
今は、アプリケーション起動と同時にOracleの接続チェック。その後、ボタンクリックなどのイベントで、
接続処理→Select処理、と記述しています。
一応、処理は問題なく動作しています。

・ただ、これだと毎回Oracleコネクションのオブジェクトが毎回作成されているような気がするのですが・・・
こういった方法は誤りでしょうか?

・接続プーリングについて正直よくわかっていないため想像なのですが、接続プーリングが有効になっていれば
毎回「Dim connection As New OracleConnection(connectionString)」とやっても問題無いのでしょうか??

・それとも、最初に取得したOracleコネクションのオブジェクトを使用した方が良いのでしょうか?
この場合ですが、コーディング方法はSingletonパターンを使用したほうが良い・・・??


わからない事だらけで申し訳ありません。
動作はするけど内部動作までの理解が乏しいため、どうかお知恵をいただければと思います。
よろしくお願いします。
引用返信 編集キー/
■20765 / inTopicNo.2)  Re[1]: Oracleコネクションの持ち方について
□投稿者/ はつね (786回)-(2008/06/15(Sun) 07:47:35)
2008/06/15(Sun) 07:58:40 編集(投稿者)

No20760 (TK さん) に返信
> Oracleへの接続なんですが、毎回接続しても問題ないのでしょうか?

コネクションプーリングがあるので、毎回接続しても速度的にも問題ありません。
また、WEBアプリであってもWindowsアプリであっても接続文字列が同じであれば、コネクションプーリングは作用します。OracleConnectionオブジェクトを使い回す必要もありません。

http://hatsune.wankuma.com/seminer/tokyo16/index.aspx
引用返信 編集キー/
■20768 / inTopicNo.3)  Re[2]: Oracleコネクションの持ち方について
□投稿者/ やじゅ (453回)-(2008/06/15(Sun) 10:51:35)
やじゅ さんの Web サイト
便乗質問は良くないかと思いつつ、関連性があると思うので質問してしまうんですけど。

オープンカーソル数って、コネクションを切ったからといって
すぐに減るってことは無いのでしょうか?


私もSingletonパターンでコネクションを使っているプロジェクトがあり
オープンカーソル数がオーバーするという報告を受けて、改善策を調べ
ていた時、コネクションプーリングがあり常時、接続→取得→切断しても
問題ないと理解しました。

ただ、オープンカーソル数をデバッグしながらSI BrowserのOpened Cursor
を最新ボタンを押しながら調べてみたのですが、オープンカーソル数が
切断したから少なくなることが無かったのです。
オープンカーソル数は、どうしたら減るんでしょうか、自動的ですか?
引用返信 編集キー/
■20769 / inTopicNo.4)  Re[3]: Oracleコネクションの持ち方について
□投稿者/ こあら (10回)-(2008/06/15(Sun) 11:11:20)
2008/06/15(Sun) 11:17:40 編集(投稿者)

No20768 (やじゅ さん) に返信
> オープンカーソル数は、どうしたら減るんでしょうか、自動的ですか?

カーソルをCLOSEします。

ORACLEの場合、同時に開くことができるカーソルの数はインスタンスで通算します。
#初期化パラメータ OPEN_CURSORS で設定します

従って、同時接続数やアプリケーションが使用するカーソル数を考慮する必要があります。



すみません。ちらっと調べたら「インスタンスで通算する」はウソっぽいです。
「一セッションで開くことのできるカーソル数」が正解っぽいです。

大変失礼致しました。
引用返信 編集キー/
■20770 / inTopicNo.5)  Re[3]: Oracleコネクションの持ち方について
□投稿者/ はつね (788回)-(2008/06/15(Sun) 12:37:30)
はつね さんの Web サイト
No20768 (やじゅ さん) に返信
> オープンカーソル数って、コネクションを切ったからといって
> すぐに減るってことは無いのでしょうか?

明示的にカーソルをCLOSEしていない場合、すぐには減りませんね。
コネクションプーリングの有無なども影響しないようです。
かといって、DataReader、DataAdapterとか使っている場合でも
どんどん増えていくという事でもないようです。

なお、Windowsアプリであればアプリ終了するとなくなりますね。

引用返信 編集キー/
■20771 / inTopicNo.6)  Re[4]: Oracleコネクションの持ち方について
□投稿者/ やじゅ (454回)-(2008/06/15(Sun) 13:41:46)
やじゅ さんの Web サイト
こあらさん、はつねさん
コメントありがとうございます。

TKさん、すみません。

> 明示的にカーソルをCLOSEしていない場合、すぐには減りませんね。

明示的にカーソルをCLOSEってどうやるのでしょうか?
ストアド上では、分かるんですが…
DataReader、DataAdapterを使っている時にDataReaderはCloseメソッド
あるとして、DataAdapterではCloseメソッドが無いですよね。

> コネクションプーリングの有無なども影響しないようです。
> かといって、DataReader、DataAdapterとか使っている場合でも
> どんどん増えていくという事でもないようです。

確かにデバッグする上でそのような現象でした。

Singletonパターンでコネクションを使っていた場合と
常時、接続→取得→切断した場合では、後者の方が
オープンカーソル数が若干減りました。
どんどん増えることは無く、どこかで数が減るのか、
使いまわしで増えないのか、そんな感じです。

> なお、Windowsアプリであればアプリ終了するとなくなりますね。

そうなんですが、メニューだけEXEで他がDLLという形式なので、メニューを
閉じないとカーソル数が増大していくだけなのかなと心配してます。
それでも最大カーソル数300にしているので、通常な使い方をしていれば、
そこまで達しないままメニューを閉じているようなので、いいかなと。
最悪、最大カーソル数を増やす方向で考えています。
引用返信 編集キー/
■20772 / inTopicNo.7)  Re[5]: Oracleコネクションの持ち方について
□投稿者/ TK (4回)-(2008/06/15(Sun) 14:07:29)
参考になるご意見、ありがとうございます。
ついでに話題も拡大したようで何よりです。

○はつねさん
> コネクションプーリングがあるので、毎回接続しても速度的にも問題ありません。
> また、WEBアプリであってもWindowsアプリであっても接続文字列が同じであれば・・・

ご意見、ありがとうございます。
接続文字列は毎回同じですので、処理のたびにOracleConnectionオブジェクトを作成しても問題ないようですね。
usingを使って処理したいと思います。
参考URLも確認させてもらっています。
アプリケーションから接続〜切断しても、Connection Lifetimeが0秒になっているので
実質的にはつなぎっぱなし、と解釈しても問題ないでしょうか?

やじゅさんの話題も、興味深く読ませていただいてます!

引用返信 編集キー/
■20773 / inTopicNo.8)  Re[5]: Oracleコネクションの持ち方について
□投稿者/ こあら (11回)-(2008/06/15(Sun) 21:40:54)
No20771 (やじゅ さん) に返信
> Singletonパターンでコネクションを使っていた場合と
> 常時、接続→取得→切断した場合では、後者の方が
> オープンカーソル数が若干減りました。

アプリ上でコネクションをCLOSEした際、‘ついでに’閉じ忘れているカーソルも閉じられているように見えます。
V$OPEN_CURSORを駆使すれば、閉じ忘れに該当しそうな処理を洗い出せるかもしれません。



No20772 (TK さん) に返信
> アプリケーションから接続〜切断しても、Connection Lifetimeが0秒になっているので
> 実質的にはつなぎっぱなし、と解釈しても問題ないでしょうか?

アプリでのコネクションのOPEN/CLOSEは、プールからのコネクションの取得/返却であって、
DBクライアントとDBサーバー間のコネクションのOPEN/CLOSEではありません。

引用返信 編集キー/
■20807 / inTopicNo.9)  Re[6]: Oracleコネクションの持ち方について
□投稿者/ やじゅ (455回)-(2008/06/17(Tue) 01:04:22)
やじゅ さんの Web サイト
No20773 (こあら さん) に返信
> アプリ上でコネクションをCLOSEした際、‘ついでに’閉じ忘れているカーソルも閉じられているように見えます。
> V$OPEN_CURSORを駆使すれば、閉じ忘れに該当しそうな処理を洗い出せるかもしれません。
>

特に閉じ忘れてる部分はないんですけどね。
ミドルウェア側でうまいこと仕組まれてるような感じです。
とりあえず、私の件に関しては解決済みとします。
また何かあればスレッドを立てた上で質問させて頂きます。

TKさんが解決なら解決済みをつけてかまいません。
引用返信 編集キー/
■20814 / inTopicNo.10)  Re[6]: Oracleコネクションの持ち方について
□投稿者/ はつね (793回)-(2008/06/17(Tue) 10:36:51)
はつね さんの Web サイト
No20772 (TK さん) に返信
>>コネクションプーリングがあるので、毎回接続しても速度的にも問題ありません。
>>また、WEBアプリであってもWindowsアプリであっても接続文字列が同じであれば・・・
>
> アプリケーションから接続〜切断しても、Connection Lifetimeが0秒になっているので
> 実質的にはつなぎっぱなし、と解釈しても問題ないでしょうか?

ODP.NETのConnection.Lifetimeは、つなぎっぱなしかどうかを制御するプロパティではあ
りません(値が0はなるべくプーリングしたままにする程度の話)。
コネクションプーリングにより接続されていなけれど使用されていないコネクションが
いつまで残るかはMax Pool sizeなど他の要素も絡んできますが、普通に使う分には、
気にする必要はないと思います。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -