- - PR -
ASP.NETでOracle接続エラーについて
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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) | ||||||||||||||||
|
投稿日時: 2006-01-19 17:28
clsDbCommand を使っている方も見せてもらいたかったですが、とりあえず何点か。
エラーとは何ですか? sDbDispose() で mDbConn.Close() を呼び出していますが、null チェックしていません。 sDbOpen() で、mDbConn のインスタンスが作成されていますが、sDbOpen() -> sDbDispose() の処理順は確実な前提条件ですか? もしかしたら、mDbConn.Close() の呼び出しで、失敗しているのかもしれませんね。 sDbOpen() -> sDbDispose() の処理順が絶対な前提条件ならば、なおの事 null チェックすべきです。 とりあえず、もう少し情報下さい。 _________________ 囚人のジレンマな日々 | ||||||||||||||||
|
投稿日時: 2006-01-19 18:04
こんばんは
囚人殿、早々の書き込みありがとうございます。
すみません 下の方に記載しておきます
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」が発生しております。 ログより「mDbConn.Open()」命令で発生している所まで掴んでおります。
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 | ||||||||||||||||
|
投稿日時: 2006-01-19 18:23
その DB ラッパークラスもどき、色々と突っ込みどころが多いんですが割愛します。
デバッグで情報を掴むんでしたら、そんな 1 ステートメントでログを吐かなくても、 ステップ実行なり、初回例外を掴むなりすれば解決すると思いますが... NullReferenceException が発生しているのは、mDbConn なのですから、 この変数がいつ Null になっているのか (Dispose されているのか) を追ってください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-01-19 18:38
こんばんは
じゃんぬねっと殿、返信ありがとうございます。 デバッガでも追いかけて見ましたが 画面表示を行い、時間が経たなければエラーが発生しません。 5分程度で処理を繰り返していれば発生しないのです。 再度、デバッガで追いかけてみます。 | ||||||||||||||||
|
投稿日時: 2006-01-19 20:08
nullチェックを追加してテストを行ってみましたが
結果は同じでした。。。 プログラムではなく、環境に問題があるのでしょうか。。。 | ||||||||||||||||
|
投稿日時: 2006-01-19 20:18
pfGetDBCommon()
これはどんな実装になってますか? _________________ 囚人のジレンマな日々 | ||||||||||||||||
|
投稿日時: 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 お手数をお掛けいたします。。。 |