- PR -

ASP.NETでOracle接続エラーについて

投稿者投稿内容
しゅら
会議室デビュー日: 2006/01/19
投稿数: 7
投稿日時: 2006-01-19 16:23
はじめまして
いつも大変参考にさせて頂いております。

ASP.NET+Data Provider for Oracle を使用しております。

更新系画面等でDB接続を行う時に時間が経ってからDB接続を行うと
OracleConnectionのOpenでエラーが発生します。
(セッションタイムアウトより少し短い時間)

手順は
 @Oracleよりデータを取得
 A18分程度待つ(何もしない)
 BOracleに接続を行う(更新処理等)
  エラーが発生する

なにか情報がございましたら、ご教授ください
以下、環境、DBクラスソース、エラーログを参考程度に
記載させて頂きます。

よろしくお願いいたします
(駄文、失礼します)

○環境:
   Windows 2003 Server SP1
   IIS 6.0(IISセッションタイムアウト20分)
   .NET Framework 1.1
   Oracle 10g R1
   ASP.NET
   .NET Data Provider for Oracle
   

○DBクラスソース:

Imports System.Data
Imports System.Data.OracleClient

Public Class clsCommonDB
Private mDbConn As OracleConnection = Nothing

Public ReadOnly Property GetDbConn() As OracleConnection
Get
Return mDbConn
End Get
End Property

Public Sub sDbOpen(ByVal rstrcon As String)
Try
gfOutPutFile("DB Connect Start:" & rstrcon, False)
'コネクション作成
mDbConn = New OracleConnection(rstrcon)
gfOutPutFile("DB Connect On1:" & mDbConn.ConnectionString.ToString, True) 'ログ出力
mDbConn.ConnectionString = rstrcon
gfOutPutFile("DB Connect On2:" & mDbConn.ConnectionString.ToString, True)
'DBオープン
mDbConn.Open()
gfOutPutFile("DB Open OK:" & mDbConn.State.ToString, True)
Catch Oraexp As OracleException
gfOutPutFile("DB Connect NG:" & Oraexp.Code & "/" & Oraexp.Message, True)
Catch exp As Exception
gfOutPutFile("DB Connect NG:" & exp.Message, True)
gfOutPutFile("DB Connect NG:" & exp.StackTrace, True)
End Try
End Sub

Public Sub sDbDispose()
Try
'コネクションClose
mDbConn.Close()
'コネクション解放
mDbConn.Dispose()
gfOutPutFile("DB Connection Dispose", True)
Catch Oraexp As OracleException
gfOutPutFile("DB Connection Dispose NG" & Oraexp.Code & "/" & Oraexp.Message, True)
End Try
End Sub
End Class


○ログ(画面放置時間:18分)
06/01/18 01:45:52:DB Connect Start:Data Source=ORACLE;User ID=xxx;Password=yyy
06/01/18 01:45:52:DB Connect On1:
06/01/18 01:45:52:DB Connect On2:Data Source=ORACLE;User ID=xxx;Password=yyy
06/01/18 01:45:52:DB Open OK:Open
06/01/18 01:45:52:DB Connection Dispose

06/01/18 02:03:58:DB Connect Start:Data Source=ORACLE;User ID=xxx;Password=yyy
06/01/18 02:03:58:DB Connect On1:
06/01/18 02:03:58:DB Connect On2:Data Source=ORACLE;User ID=xxx;Password=yyy
06/01/18 02:03:58:DB Connect NG:オブジェクト参照がオブジェクト インスタンスに設定されていません。
06/01/18 02:03:58:DB Connect NG: at System.Data.OracleClient.UnsafeNativeMethods.OCIEnvCreate(IntPtr& envhpp, MODE mode, HandleRef ctxp, HandleRef malocfp, HandleRef ralocfp, HandleRef mfreefp, Int32 xtramemsz, HandleRef usrmempp)
at System.Data.OracleClient.TracedNativeMethods.OCIEnvCreate(IntPtr& envhpp, MODE mode, HandleRef ctxp, HandleRef malocfp, HandleRef ralocfp, HandleRef mfreefp, Int32 xtramemsz, HandleRef usrmempp)
at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode)
at System.Data.OracleClient.OracleInternalConnection.Open(Object transact)
at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions, Object transact)
at System.Data.OracleClient.OracleConnection.OpenInternal(OracleConnectionString parsedConnectionString, Object transact)
at System.Data.OracleClient.OracleConnection.Open()
at apl.clsCommonDB.sDbOpen(String rstrcon)
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-19 17:28
clsDbCommand を使っている方も見せてもらいたかったですが、とりあえず何点か。

引用:

 BOracleに接続を行う(更新処理等)
  エラーが発生する


エラーとは何ですか?

sDbDispose() で mDbConn.Close() を呼び出していますが、null チェックしていません。
sDbOpen() で、mDbConn のインスタンスが作成されていますが、sDbOpen() -> sDbDispose() の処理順は確実な前提条件ですか?
もしかしたら、mDbConn.Close() の呼び出しで、失敗しているのかもしれませんね。
sDbOpen() -> sDbDispose() の処理順が絶対な前提条件ならば、なおの事 null チェックすべきです。

とりあえず、もう少し情報下さい。

_________________
囚人のジレンマな日々
しゅら
会議室デビュー日: 2006/01/19
投稿数: 7
投稿日時: 2006-01-19 18:04
こんばんは

囚人殿、早々の書き込みありがとうございます。

引用:

clsDbCommand を使っている方も見せてもらいたかったですが、とりあえず何点か。


すみません
下の方に記載しておきます

引用:

 エラーとは何ですか?


「オブジェクト参照がオブジェクト インスタンスに設定されていません。」が発生しております。
ログより「mDbConn.Open()」命令で発生している所まで掴んでおります。

引用:

sDbDispose() で mDbConn.Close() を呼び出していますが、null チェックしていません。


nullチェックをしてテストを行ってみます。

引用:

sDbOpen() で、mDbConn のインスタンスが作成されていますが、sDbOpen() -> sDbDispose() の処理順は確実な前提条件ですか?
sDbOpen() -> sDbDispose() の処理順が絶対な前提条件ならば、なおの事 null チェックすべきです。


DisposeはTry〜CatchのFinallyで行っております。
前提としてメイクしております。

お手数をお掛けいたしますが、よろしくお願いいたします。
以下、使用している側のソースを記載いたします。

ソース:(使用側)
Private Function mfSetDisp(ByVal pTCD As String, ByVal pSCD As String) As Boolean
Dim dbClass As clsCommonDB
Dim strSQL As String
Dim oraReader As OracleDataReader

Try
dbClass = pfGetDBCommon()

strSQL = mfDispSQL(pTCD, pSCD)
oraReader = dbClass.sDbExecuteReader(strSQL)

oraReader.Read()

If oraReader.HasRows = False Then
mOnload = "alert('対象データが存在しません');window.top.location.href = '" & CC.FRM.FUZOKU_Folder_k & CC.FRM.Main_Frame & "'"
oraReader.Close()
Session(CC.SS.OnLoad) = mOnload
Server.Transfer("Dummy.aspx")
Return False
End If

Me.txtCode.Text = oraReader.Item("CODE").Tostring
以下 画面項目セット処理

oraReader.Close()

Finally
If IsNothing(oraReader) = False Then
oraReader.Dispose()
End If
dbClass.sDbDispose()
If IsNothing(dbClass) = False Then
dbClass = Nothing
End If
End Try

End Function

ソース:(DBクラスソース DataReader使用)
Public Function sDbExecuteReader(ByVal rstrSql As String) As OracleDataReader
Dim oraCmd As OracleCommand
Dim oraReader As OracleDataReader

Try
'コマンド作成
oraCmd = mDbConn.CreateCommand
'トランザクション設定
oraCmd.Transaction = Nothing
'SQL文セット
oraCmd.CommandText = rstrSql
'SQL発行
oraReader = oraCmd.ExecuteReader
Return oraReader

Catch Oraexp As OracleException
gfOutPutFile("DB ExecuteReader NG:" & Oraexp.Code & "/" & Oraexp.Message, True)
Finally
If Not IsNothing(oraCmd) Then
oraCmd.Dispose()
End If
End Try
End Function


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-19 18:23
その DB ラッパークラスもどき、色々と突っ込みどころが多いんですが割愛します。

デバッグで情報を掴むんでしたら、そんな 1 ステートメントでログを吐かなくても、
ステップ実行なり、初回例外を掴むなりすれば解決すると思いますが...

NullReferenceException が発生しているのは、mDbConn なのですから、
この変数がいつ Null になっているのか (Dispose されているのか) を追ってください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
しゅら
会議室デビュー日: 2006/01/19
投稿数: 7
投稿日時: 2006-01-19 18:38
こんばんは
じゃんぬねっと殿、返信ありがとうございます。

デバッガでも追いかけて見ましたが
画面表示を行い、時間が経たなければエラーが発生しません。

5分程度で処理を繰り返していれば発生しないのです。

再度、デバッガで追いかけてみます。
しゅら
会議室デビュー日: 2006/01/19
投稿数: 7
投稿日時: 2006-01-19 20:08
nullチェックを追加してテストを行ってみましたが
結果は同じでした。。。

プログラムではなく、環境に問題があるのでしょうか。。。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-19 20:18
pfGetDBCommon()
これはどんな実装になってますか?
_________________
囚人のジレンマな日々
しゅら
会議室デビュー日: 2006/01/19
投稿数: 7
投稿日時: 2006-01-19 20:23
あ。。。

囚人殿、申し訳ありません
以下のようになっております

Private Function pfGetDBCommon() As clsCommonDB
Dim dbClass As clsCommonDB = New clsCommonDB
dbClass.sDbOpen("Data Source=ORACLE;User ID=xxx;Password=yyy")
Return dbClass
End Function

お手数をお掛けいたします。。。

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