- PR -

ODP.NETでストール、異常終了してしまう

1
投稿者投稿内容
KATSU
常連さん
会議室デビュー日: 2003/02/13
投稿数: 33
お住まい・勤務地: 静岡県
投稿日時: 2003-11-12 23:23
C#.NET(.NET Framework 1.0a)
ODP for .NET(9.2.0.2)
Oracle9i(9.2.0.2)
でWindowsアプリの開発を行っています。

接続文字列で「Pooling=true」を指定し
DB接続
コマンド発行(Reader or ExecuteNonQuery)
接続クローズ(使用したReader,CommandのDisposeも実行)
を繰り返していると、(繰り返しの回数は不定です)

アプリケーションがストールしたり、
いきなり終了してしまう現象が発生しています。

試しに、「Pooling=false」で接続すると上記の現象は発生しませんでした。

Oracle周りの操作をクラス化しています。

このクラスの作り方に問題があるのでしょうか?
それとも、他に原因があるのでしょうか?

よろしくお願いします。

コード:

using System;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

namespace AAAA
{
public class clsOraDb
{
public static string clsOraDbConnString;

public OracleConnection Conn;
public OracleTransaction Trans;
public OracleCommand Command;
public OracleDataReader Reader;

public clsOraDb()
{
}

public void DbOpen()
{
try
{
this.Conn = new OracleConnection(clsOraDbConnString);
this.Conn.Open();
}
catch (Exception ex)
{
throw new Exception("DB Close Error ConnString='" + clsOraDbConnString + "'",ex);
}
}

public void DbClose()
{
try
{
if (this.Reader != null)
{ this.Reader.Dispose(); }
if (this.Command != null)
{ this.Command.Dispose();}
if (this.Trans != null)
{ this.Trans.Dispose(); }
this.Conn.Close();
this.Conn.Dispose();
}
catch (Exception ex)
{
throw new Exception("DB Close Error ConnString='" + clsOraDbConnString + "'",ex);
}
}
}
}


クラスを呼ぶ側
string strConn;
strConn = "User ID=aaa";
strConn += ";Password=bbb";
strConn += ";Data Source=ccc";
strConn += ";Pooling=true";
clsOraDb.clsOraDbConnString = strConn;
(略)
clsOraDb DB = new clsOraDB();
DB.Open();
DB.Command = DB.Conn.CreateCommand();
DB.Command.CommandText = "update Table_A set ";
DB.Command.CommandText += "A=1";
DB.Command.CommandText += " where B=2";
DB.Command.ExecuteNonQuery();
DB.Command.Dispose();
DB.Close()
この様な処理を繰り返しているとストールまたは終了してしまう。



[ メッセージ編集済み 編集者: KATSU 編集日時 2003-11-12 23:25 ]

[ メッセージ編集済み 編集者: KATSU 編集日時 2003-11-12 23:29 ]
KOBE0927
会議室デビュー日: 2003/11/26
投稿数: 3
投稿日時: 2003-11-26 18:29
自分も似たような状況が発生しています。
異状終了する際に、何かエラーは吐き出されていませんか?

自分の場合は、Oracle側から、Data Provider Internal Error(-3000)と
言うエラーが吐き出されております。

KATSU
常連さん
会議室デビュー日: 2003/02/13
投稿数: 33
お住まい・勤務地: 静岡県
投稿日時: 2003-11-26 21:41
返答ありがとうございます。
(半ばあきらめていましたが...)

引用:

KOBE0927さんの書き込み (2003-11-26 18:29) より:
自分も似たような状況が発生しています。
異状終了する際に、何かエラーは吐き出されていませんか?

自分の場合は、Oracle側から、Data Provider Internal Error(-3000)と
言うエラーが吐き出されております。



エラーは、何処に吐き出されていますか?
sqlnet.log?
それとも上記の例外が「ODP for .NET」から
スローされているということでしょうか?


投稿後プログラムソースを再度読み返したところ、
Reader.Dispose();
Command.Dispose();
していない箇所が見つかり訂正したところ、
問題の現象が発生する頻度が減りましたが、
ゼロにはなりませんでした。

結局「Pooling=false」でリリースしました。
「Pooling=true」に比較すると若干レスポンスが落ちますが、
使用に差し支えないレスポンスが出ていることと
安定動作には替えられませんので...
KOBE0927
会議室デビュー日: 2003/11/26
投稿数: 3
投稿日時: 2003-11-27 13:17
Catchで取れると思いますが。
あと、アメリカのオラクルのBBSにも同じ現象が発生している事を
オラクルも知っているみたいで、BBSには次のバージョンで
対応すると書いてあります。

Try

OraCon.Open() 'DB接続OPEN
OraCmd.ExecuteNonQuery()
OraCon.Close() 'DB接続CLOSE  

Catch ex As OracleException
ExceptionErrorMessage = ex.Message()
End Try
_________________
KATSU
常連さん
会議室デビュー日: 2003/02/13
投稿数: 33
お住まい・勤務地: 静岡県
投稿日時: 2003-11-27 14:11
KOBE0927 さん
有用な情報ありがとうございます。

私が試していたときには
Catch 出来ずにいきなり異常終了したように見えたので...
再度試してみます。

OracleのBBSも再度検索してみます。
ありがとうございました。

[ メッセージ編集済み 編集者: KATSU 編集日時 2003-11-27 17:47 ]
KOBE0927
会議室デビュー日: 2003/11/26
投稿数: 3
投稿日時: 2003-11-27 17:30
自分の場合ですが、
VB側から、オラクルのプロシージャ-をコールして、
検索した結果をカーソルでもらう処理をしていますが、
オラクル側でExceptionが発生した場合に、
カーソルに何もセットしない時に、エラーが発生したり発生しなかたりの
現象が発生していましたが、Exceptionが発生した時に
カーソルに何でも良いので値をセットする事で、
この現象は回避されました。

_________________
KATSU
常連さん
会議室デビュー日: 2003/02/13
投稿数: 33
お住まい・勤務地: 静岡県
投稿日時: 2003-11-27 18:01
私の方はストアドをコールしていないところで発生
しているので、異なる問題かも知れません。

ODPのリリースノートにも書いてあるのですが、
現行のリリースにはメモリリークのバグもあるようですので、
この辺りとの関連もあるかも?

Pooling=true との関係も断言できませんが、
Pooling=false だと安定したことは事実です。

ひどい時には、コマンドボタンのデリゲートされるハズの
プロシジャーが全く反応しなくなるような現象も起きました。

また、なにかわかったらココにあげさせてもらいます。
1

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