私は、新しい Oracle インストールでパッケージ内のストアド プロシージャを実行するたびに、断続的に発生し続ける上記に困惑しています。
sproc は WCF から呼び出され、次の例外を返します。
<ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<HelpLink i:nil="true"/>
<InnerException>
<HelpLink i:nil="true"/>
<InnerException i:nil="true"/>
<Message>ORA-12537: Network Session: End of file</Message>
<StackTrace><![CDATA[at OracleInternal.Network.ReaderStream.Read(OraBuf OB)
at OracleInternal.TTC.OraBufReader.GetDataFromNetwork()
at OracleInternal.TTC.OraBufReader.Read(Boolean bIgnoreData)
at OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(Boolean bIgnoreData)
at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(Accessor[]& defineAccessors, Accessor[] bindAccessors, Boolean bHasReturningParams, SQLMetaData& sqlMetaData, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int32 noOfRowsToFetch, Int32& noOfRowsFetched, Int64& queryId, Int32 longFetchSize, Int64 initialLOBFetchSize, Int64[] scnFromExecution, Boolean bAllInputBinds, Int32 arrayBindCount, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Int64[]& rowsAffectedByArrayBind, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause, List`1& implicitRSList, Boolean bLOBArrayFetchRequired)]]></StackTrace>
<Type>OracleInternal.Network.NetworkException</Type>
</InnerException>
<Message>ORA-12537: Network Session: End of file</Message>
<StackTrace><![CDATA[at Oracle.ManagedDataAccess.Client.OracleException.HandleError(OracleTraceLevel level, OracleTraceTag tag, Exception ex, OracleLogicalTransaction oracleLogicalTransaction)
at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(Accessor[]& defineAccessors, Accessor[] bindAccessors, Boolean bHasReturningParams, SQLMetaData& sqlMetaData, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int32 noOfRowsToFetch, Int32& noOfRowsFetched, Int64& queryId, Int32 longFetchSize, Int64 initialLOBFetchSize, Int64[] scnFromExecution, Boolean bAllInputBinds, Int32 arrayBindCount, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Int64[]& rowsAffectedByArrayBind, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause, List`1& implicitRSList, Boolean bLOBArrayFetchRequired)
at OracleInternal.ServiceObjects.OracleDataReaderImpl.FetchMoreRows(Int32 noOfRowsToFetch, Boolean fillReader, Boolean returnPSTypes)
at Oracle.ManagedDataAccess.Client.OracleDataReader.Read()
at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at Oracle.ManagedDataAccess.Client.OracleDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at Oracle.ManagedDataAccess.Client.OracleDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at ***REDACTED***
at ***REDACTED***
at ***REDACTED***
at SyncInvokeQtyAdjustments_Get(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)]]></StackTrace>
<Type>Oracle.ManagedDataAccess.Client.OracleException</Type>
</ExceptionDetail>
それにもパターンはないようです。
これが私が試したものです:
- GAC をチェックして、複数のバージョンの ODP が存在しないことを確認しました。マネージド データ アクセス コンポーネントが nuget からインポートされました - バージョンは 12.1.2400 です。
- ソートする接続文字列にさまざまな属性を追加しました。つまり、persist security info=True;Self Tuning=True;Min Pool Size=3;Max Pool Size=25;Incr Pool Size=3;Decr Pool Size=1;Connection Timeout=20 です。 ;プーリング=false;接続ライフタイム=59; -さまざまな構成を試しましたが、うまくいきませんでした。たとえば、Pooling を false/true に設定するなどです。
汎用コードでのオブジェクトの確実な破棄。現在使用されているテストコードは次のとおりです。
using System.Data; using System.Data.Common; using Oracle.ManagedDataAccess.Client; /// <summary> /// Extensions for xxxxx. /// </summary> /// <seealso cref="System.Data.Entity.DbContext" /> public partial class xxxxEntities { public virtual DataSet ExecuteStoredProcedureAsDataSet(string storedProcName, int commandTimeoutSeconds, object[] parameters) { var sqlCommand = this.Database.Connection.CreateCommand(); var resultSet = new DataSet(); sqlCommand.CommandType = CommandType.StoredProcedure; sqlCommand.CommandTimeout = commandTimeoutSeconds; sqlCommand.CommandText = storedProcName; sqlCommand.Parameters.AddRange(parameters); var referenceCursor = new OracleParameter("P_DATAOUT", OracleDbType.RefCursor) { Direction = ParameterDirection.Output }; sqlCommand.Parameters.Add(referenceCursor); using (var adapter = CreateDataAdapter(this.Database.Connection)) { adapter.SelectCommand = sqlCommand; adapter.Fill(resultSet); } referenceCursor.Dispose(); sqlCommand.Dispose(); return resultSet; } /// <summary> /// Creates the data adapter. /// </summary> /// <param name="connection">The connection.</param> /// <returns>DbDataAdapter.</returns> DbDataAdapter CreateDataAdapter(DbConnection connection) { return DbProviderFactories.GetFactory(connection).CreateDataAdapter(); } }
ストアド プロシージャ内のクエリを「固定」値に切り詰めて、sproc 内に問題の原因がないことを確認します。以下に説明するいくつかの興味深い問題を見つけました。
だから、私は途方に暮れています。ODP トレースを有効にしましたが、プールを処理する際に問題が発生しているように見えました。初めて、私はこれを得ました:
2016-07-26 11:43:55.268765 TID:6 (PRI) (SVC) (ENT) OracleConnectionImpl.EvaluateDbMajorMinorPatchsetVersion()
2016-07-26 11:43:55.268765 TID:6 (PRI) (SVC) (EXT) OracleConnectionImpl.EvaluateDbMajorMinorPatchsetVersion()
2016-07-26 11:43:55.268765 TID:6 (PRI) (SVC) (EXT) OracleConnectionImpl.Connect() (oper=open) (aff=n/a) (inst=WMSQA) (affmatch=n/a) (sessid=2540:42190) (F;F;F;WMSQA;N) (pmid=29382239)
2016-07-26 11:43:55.268765 TID:6 (PRI) (ENT) (CP) PoolManager`3.PutNewPR() (aff=n/a) (inst=WMSQA) (affmatch=n/a) (sessid=2540:42190) (F;F;F;WMSQA;N) (pmid=29382239)
2016-07-26 11:43:55.268765 TID:6 (PRI) (ENT) (CP) OraclePool.PutNewPR()
2016-07-26 11:43:55.268765 TID:6 (PRI) (ENT) (CP) Pool`3.PutNewPR()
2016-07-26 11:43:55.268765 TID:6 (PRI) (CP) Pool`3.PutNewPR() (oper=cp:put:reg1) (aff=n/a) (inst=WMSQA) (affmatch=n/a) (sessid=2540:42190) (F;F;T;WMSQA;N) (pmid=29382239)
2016-07-26 11:43:55.268765 TID:6 (PRI) (EXT) (CP) Pool`3.PutNewPR()
2016-07-26 11:43:55.268765 TID:6 (PRI) (EXT) (CP) OraclePool.PutNewPR()
2016-07-26 11:43:55.268765 TID:6 (PRI) (EXT) (CP) PoolManager`3.PutNewPR() (aff=n/a) (inst=WMSQA) (affmatch=n/a) (sessid=2540:42190) (F;F;T;WMSQA;N) (pmid=29382239)
2016-07-26 11:43:55.269765 TID:6 (PRI) (EXT) (CP) PoolManager`3.CreateNewPR() (aff=n/a) (inst=WMSQA) (affmatch=n/a) (sessid=2540:42190) (F;F;T;WMSQA;N) (pmid=29382239)
2016-07-26 11:43:55.269765 TID:6 (PRI) (CP) PoolManager`3.PopulatePool() PopulatePoolThreadFunc(created=2; max=25; total=3)
2016-07-26 11:43:55.269765 TID:6 (PRI) (EXT) (CP) PoolManager`3.PopulatePool()
2016-07-26 11:43:55.880826 TID:15 (PRI) (ENT) TTCExecuteSql.ReceiveExecuteResponse()
2016-07-26 11:43:55.881826 TID:15 (PRI) (ENT) OracleException.ctor()
2016-07-26 11:43:55.885826 TID:15 (PRI) (ENT) OracleError.ctor()
2016-07-26 11:43:55.886826 TID:15 (PRI) (EXT) OracleError.ctor()
2016-07-26 11:43:55.886826 TID:15 (PRI) (EXT) OracleException.ctor()
2016-07-26 11:43:55.890827 TID:15 (PRI) (TTC) (ERR) TTCExecuteSql.ReceiveExecuteResponse() (txnid=n/a) OracleInternal.Network.NetworkException (0x000030F9): ORA-12537: Network Session: End of file
at OracleInternal.Network.ReaderStream.Read(OraBuf OB)
at OracleInternal.TTC.OraBufReader.GetDataFromNetwork()
at OracleInternal.TTC.OraBufReader.Read(Boolean bIgnoreData)
at OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(Boolean bIgnoreData)
at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(Accessor[]& defineAccessors, Accessor[] bindAccessors, Boolean bHasReturningParams, SQLMetaData& sqlMetaData, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int32 noOfRowsToFetch, Int32& noOfRowsFetched, Int64& queryId, Int32 longFetchSize, Int64 initialLOBFetchSize, Int64[] scnFromExecution, Boolean bAllInputBinds, Int32 arrayBindCount, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Int64[]& rowsAffectedByArrayBind, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause, List`1& implicitRSList, Boolean bLOBArrayFetchRequired)
トレースを 127 に上げて、次のようになりました。
2016-07-26 14:22:11.459348 TID:1 (PRI) (SVC) (ENT) OracleDataReaderImpl.FetchMoreRows()
2016-07-26 14:22:11.459348 TID:1 (PRI) (SVC) (ENT) OracleConnectionImpl.AddAllPiggyBackRequests()
2016-07-26 14:22:11.459348 TID:1 (PRI) (TTC) (ENT) TTCClose.Write()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (ENT) TTCFunction.WriteFunctionHeader()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (ENT) TTCMessage.WriteTTCCode()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (EXT) TTCMessage.WriteTTCCode()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (EXT) TTCFunction.WriteFunctionHeader()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (EXT) TTCClose.Write()
2016-07-26 14:22:11.460348 TID:1 (PRI) (SVC) (EXT) OracleConnectionImpl.AddAllPiggyBackRequests()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (ENT) TTCExecuteSql.SendExecuteRequest()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (ENT) TTCExecuteSql.GetExecuteOptions()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (EXT) TTCExecuteSql.GetExecuteOptions()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (ENT) TTCExecuteSql.WriteOall8Message()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (ENT) TTCFunction.WriteFunctionHeader()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (ENT) TTCMessage.WriteTTCCode()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (EXT) TTCMessage.WriteTTCCode()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (EXT) TTCFunction.WriteFunctionHeader()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (ENT) TTCExecuteSql.WritePisdef()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (EXT) TTCExecuteSql.WritePisdef()
2016-07-26 14:22:11.460348 TID:1 (PRI) (TTC) (ENT) TTCExecuteSql.WritePisdefData()
2016-07-26 14:22:11.461348 TID:1 (PRI) (TTC) (EXT) TTCExecuteSql.WritePisdefData()
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 00 4C 00 00 06 00 00 00 |.L......|
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 00 00 |.. |
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 11 69 00 01 01 01 01 02 |.i......|
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 03 5E 00 02 80 40 01 03 |.^...@..|
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 00 00 01 01 0D 00 00 00 |........|
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 00 01 01 00 00 00 00 00 |........|
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 00 00 00 00 00 00 01 00 |........|
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 00 00 00 00 00 00 00 00 |........|
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 02 01 36 00 00 00 03 A7 |..6.....|
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) EB C6 00 01 01 00 00 00 |........|
2016-07-26 14:22:11.461348 TID:1 (NET) (SND) 00 00 |.. |
2016-07-26 14:22:11.461348 TID:1 (PRI) (TTC) (EXT) TTCExecuteSql.WriteOall8Message()
2016-07-26 14:22:11.461348 TID:1 (PRI) (TTC) (EXT) TTCExecuteSql.SendExecuteRequest()
2016-07-26 14:22:11.461348 TID:1 (PRI) (TTC) (ENT) TTCExecuteSql.ReceiveExecuteResponse()
2016-07-26 14:22:11.461348 TID:1 (PRI) (BUF) (COBP.GET) (poolid:2) (key:8192) (bufid:8) (count:5) (OraBufReader.GetDataFromNetwork)
2016-07-26 14:22:12.161348 TID:1 (PRI) (ENT) TTCExecuteSql.ReceiveExecuteResponse()
2016-07-26 14:22:12.162348 TID:1 (PRI) (ENT) OracleException.ctor()
2016-07-26 14:22:12.162348 TID:1 (PRI) (ENT) OracleError.ctor()
2016-07-26 14:22:12.162348 TID:1 (PRI) (EXT) OracleError.ctor()
2016-07-26 14:22:12.162348 TID:1 (PRI) (EXT) OracleException.ctor()
2016-07-26 14:22:12.163348 TID:1 (PRI) (TTC) (ERR) TTCExecuteSql.ReceiveExecuteResponse() (txnid=n/a) OracleInternal.Network.NetworkException (0x000030F9): ORA-12537: Network Session: End of file
at OracleInternal.Network.ReaderStream.Read(OraBuf OB)
at OracleInternal.TTC.OraBufReader.GetDataFromNetwork()
at OracleInternal.TTC.OraBufReader.Read(Boolean bIgnoreData)
at OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(Boolean bIgnoreData)
at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(Accessor[]& defineAccessors, Accessor[] bindAccessors, Boolean bHasReturningParams, SQLMetaData& sqlMetaData, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int32 noOfRowsToFetch, Int32& noOfRowsFetched, Int64& queryId, Int32 longFetchSize, Int64 initialLOBFetchSize, Int64[] scnFromExecution, Boolean bAllInputBinds, Int32 arrayBindCount, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Int64[]& rowsAffectedByArrayBind, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause, List`1& implicitRSList, Boolean bLOBArrayFetchRequired)
2016-07-26 14:22:12.163348 TID:1 (PRI) (EXT) TTCExecuteSql.ReceiveExecuteResponse()
2016-07-26 14:22:12.163348 TID:1 (PRI) (TTC) (EXT) TTCExecuteSql.ReceiveExecuteResponse()
2016-07-26 14:22:12.163348 TID:1 (PRI) (ENT) OracleDataReaderImpl.FetchMoreRows()
2016-07-26 14:22:12.163348 TID:1 (PRI) (SVC) (ERR) OracleDataReaderImpl.FetchMoreRows() (txnid=n/a) Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-12537: Network Session: End of file ---> OracleInternal.Network.NetworkException (0x000030F9): ORA-12537: Network Session: End of file
selectステートメントとwhere句をコメントアウトしてsprocのクエリを微調整し、徐々にそれらを元に戻して、問題がクエリであるかどうかを確認しました(ただし、Oracle Developerで実行しても問題ありません)。このステートメントに絞り込みました-再導入すると、ファイルの終わりの例外が再び発生します。
WHERE
-- Only handle records that contain a numeric value in the ref field.
ISNUMERIC(PTT.REF_FIELD_2) = 1
パッケージ内の ISNUMERIC 関数は次のようになります。
FUNCTION ISNUMERIC (p_string IN VARCHAR2) RETURN INT
IS
v_new_num NUMBER;
BEGIN
IF p_string IS NULL
THEN
RETURN 0;
END IF;
v_new_num := TO_NUMBER(p_string);
RETURN 1;
EXCEPTION
WHEN VALUE_ERROR THEN
RETURN 0;
END ISNUMERIC;
最初は、キャッチされた例外の数が原因でそれ以上の実行が妨げられているのではないかと考えました。ただし、関数を単純化して「1」を返すだけにしましたが、それでも毎回機能しませんでした。
クエリの結果は、ref カーソルを介して返されます。
PROCEDURE DEVSP_API_GETxxxx(
P_STARTDATE IN DATE
, P_ENDDATE IN DATE
, P_xxx IN P_xxx_TYPE
, <snip>
, P_DATAOUT OUT sys_refcursor
) AS
BEGIN
OPEN P_DATAOUT FOR
SELECT
'asdsa' as "x",
'sadasdsad' as "z",
0 as "Qty",
<snip>
最後に、select ステートメントと where 句からすべての関数呼び出しを削除しました。これにより、エラーの発生が即座に停止しました。それらを、関数が実行するのと同じロジックに置き換えました。
どうしたの?関数の呼び出しを含むパッケージ内で sprocs を実行する場合、ODP.net に制限はありますか? 少し奇妙に思えます。
回避策は関数を使用しないことですが、一部の select ステートメントには、Union ベースのクエリで同じロジックを繰り返す条件式が含まれているため、そうしたくありません。
どんな助けや指針も大歓迎です!
Ps。透明性のために、私は先週 Oracle フォーラムにこれを投稿しましたが、応答はありませんでした。
更新 : 2016 年 8 月 3 日
最後に、サーバーにアクセスして、少しトレースを試すことができました。プロセスが途中で終了したときにトレース ログに記録された内容は次のとおりです。
*** 2016-08-03 10:14:39.111
*** SESSION ID:(2526.53330) 2016-08-03 10:14:39.111
*** CLIENT ID:() 2016-08-03 10:14:39.111
*** SERVICE NAME:(XXXXX) 2016-08-03 10:14:39.111
*** MODULE NAME:(iisexpress.exe) 2016-08-03 10:14:39.111
*** CLIENT DRIVER:(ODPM.NET) 2016-08-03 10:14:39.111
*** ACTION NAME:() 2016-08-03 10:14:39.111
Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0x0] [PC:0x3CEBE1D, pmucfst()+13] [flags: 0x0, count: 1]
Incident 109041 created, dump file /u01/app/oracle/diag/rdbms/xxxx/XXXX/incident/incdir_109041/XXXXX_ora_13149_i109041.trc
ORA-07445: exception encountered: core dump [pmucfst()+13] [SIGSEGV] [ADDR:0x0] [PC:0x3CEBE1D] [Address not mapped to object] []
ssexhd: crashing the process...
Shadow_Core_Dump = PARTIAL
同じフォルダーにコア ダンプも表示されます。そこにあるバケット トレース ファイルを grep して、明白な何かがあるかどうかを確認してみました。
関数を使用するたびに、以前に sprocs を実行しようとしたときの大量のコア ダンプを確認できます。したがって、少なくとも妥当な一貫性があります。