- PR -

ODP.NETを利用したDB接続について

1
投稿者投稿内容
たっくん
会議室デビュー日: 2004/10/04
投稿数: 2
投稿日時: 2004-10-04 15:42
いつもお世話になっています。

ODP.NETを利用してDBに接続するプログラムを作成しているのですが、
ひとつ疑問がありましてOracleConnectionクラスを生成する際に
usingを使用した場合、OracleConnectionのCloseは明示的に実装する必要が
あるのでしょうか?
(ADO.NETではCloseしないといけないとどっかで見た記憶があります)
以下の例だとfinally句でOracleConnectionを閉じているのですが、
実装しなくてもいいような・・・

例)
using(OracleConnection connection = new OracleConnection("DB接続文字列"))
{
connection.Open(); // コネクションを開く
// トランザクションの開始
OracleTransaction tran = connection.BeginTransaction();
try
{
〜 SQLの実行 〜
tran.Commit(); // コミット
}
catch(OracleException ex)
{
tran.Rollback(); // ロールバック
throw ex;
}
finally
{
connection.Close(); // クローズを明記する必要がある?
}
}

環境
OS:Windows 2003 Server
DB:Oracle 10g
ぺがらぼ
会議室デビュー日: 2004/06/25
投稿数: 12
投稿日時: 2004-10-04 17:45
引用:

たっくんさんの書き込み (2004-10-04 15:42) より:
いつもお世話になっています。

ODP.NETを利用してDBに接続するプログラムを作成しているのですが、
ひとつ疑問がありましてOracleConnectionクラスを生成する際に
usingを使用した場合、OracleConnectionのCloseは明示的に実装する必要が
あるのでしょうか?
(ADO.NETではCloseしないといけないとどっかで見た記憶があります)
以下の例だとfinally句でOracleConnectionを閉じているのですが、
実装しなくてもいいような・・・

例)
using(OracleConnection connection = new OracleConnection("DB接続文字列"))
{
connection.Open(); // コネクションを開く
// トランザクションの開始
OracleTransaction tran = connection.BeginTransaction();
try
{
〜 SQLの実行 〜
tran.Commit(); // コミット
}
catch(OracleException ex)
{
tran.Rollback(); // ロールバック
throw ex;
}
finally
{
connection.Close(); // クローズを明記する必要がある?
}
}

環境
OS:Windows 2003 Server
DB:Oracle 10g




たっくんさん、こんばんは。
仮にクローズが必要無いとします。
しかし、他の方がソースを見た時にどう判断されるでしょうか?
Closeが無い…と思われますね。(まぁ、コメントがあれば解るでしょうが…)
それと、たっくんさんのプログラムが
確実にコネクションがクローズされると保障されますか?
万が一のことを考え、必ずクローズされる方が良いと思いますが、そのあたりはご自分の判断だと思われます。
ただ、私的な意見としては、クローズメソッドを書いている方が、綺麗なコーディングではないかと思いますが…
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-10-04 20:27
 MSDNのOracleConnectionの説明を見ると、
引用:

Close または Dispose を呼び出すことによって明示的に接続を閉じると、ネイティブ リソースをより効率的に使用でき、拡張性およびアプリケーション全体のパフォーマンスが向上します。


とあります。これより、DisposeとCloseは等価に実装してあると予想されます。等価に実装してあるなら、using文を使用しているため、Closeメソッドの呼び出しは不要です。

 ただし、OracleTransactionはDisposeする必要があります。複数のオブジェクトがあるので、using文を使わない方がすっきりすると思います。
_________________
たっくん
会議室デビュー日: 2004/10/04
投稿数: 2
投稿日時: 2004-10-04 23:59
Jittaさん、ぺがらぼさん返答ありがとうございます。

OracleTransactionクラスのDisposeも必要なのですね。
usingを使わないほうがすっきりとした実装になりそうなので、
finally句でCloseとDisposeを記述するように変更します。

いろいろありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-10-05 06:29
引用:

たっくんさんの書き込み (2004-10-04 23:59) より:

OracleTransactionクラスのDisposeも必要なのですね。


 DisposeメソッドがあるクラスはDisposeする、を原則としてください。また、Disposeがなくても、マニュアルを見てIDisposableインタフェースを実装しているクラスについては、代替メソッドを呼ぶ必要があります。この「代替メソッド」は、たとえば通信やファイルを扱うクラスではCloseメソッドが該当します。この辺はマニュアルに頼るしかありません。
_________________
1

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