web-dev-qa-db-de.com

Von ODP.net verwalteter Treiber wirft ORA-12570: Netzwerksitzung: Unerwarteter Paketlesefehler

In einem unserer Produkte rufen wir Daten aus der Oracle-Datenbank mithilfe gespeicherter Prozeduren mit dem verwalteten ODP.net-Treiber ab.

Hin und wieder (ungefähr alle 1000 Anfragen) erhalten wir die folgende Ausnahme:

(ORA-12570: Network Session: Unexpected packet read error)
---> Oracle.ManagedDataAccess.Client.OracleException: ORA-12570: Network Session: Unexpected packet read error
---> OracleInternal.Network.NetworkException: ORA-12570: Network Session: Unexpected packet read error
---> System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: size
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, SocketError& errorCode)
   at OracleInternal.Network.ReaderStream.ReadIt(OraBuf OB, Int32 len)
   --- End of inner exception stack trace ---
   at OracleInternal.Network.ReaderStream.ReadIt(OraBuf OB, Int32 len)
   at OracleInternal.Network.ReaderStream.WaitForReset()
   at OracleInternal.Network.OracleCommunication.Reset()
   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, Int32 initialLOBFetchSize, Int64[] scnFromExecution, Boolean& bAllPureInputBinds, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause)
   --- End of inner exception stack trace ---
   at Oracle.ManagedDataAccess.Client.OracleException.HandleError(OracleTraceLevel level, OracleTraceTag tag, Exception ex)
   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, Int32 initialLOBFetchSize, Int64[] scnFromExecution, Boolean& bAllPureInputBinds, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause)
   at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int32 lobPrefetchSize, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Boolean isFromEF)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()

Es scheint, als würde ODP.net System.Net.Sockets.Socket.Receive mit einem ungültigen Größenparameter (<= 0 oder größer als die Länge des Puffers minus dem Wert des Offset-Parameters) aufrufen.

Die Ausnahme kann nicht manuell reproduziert werden und wird niemals ausgelöst, wenn verschiedene Prozeduren mit unterschiedlichen Parametern (dh zufällig) ausgeführt werden.

Konfiguration: Von ODP.net verwaltete Treiberversion: 4.121.1.0 . Net Framework 4.5 Oracle-Serverversion: Oracle Database 11g Enterprise Edition Version 11.2.0.4.0 (Linux)

Hat jemand dieses Problem schon erlebt? Gibt es Fixes?

Danke im Voraus!

13
vc 74

Nach dem Öffnen eines Tickets mit Oracle-Support haben sie eine inoffizielle aktualisierte Version der verwalteten ODP.net-Bibliothek gesendet, die das Problem zu beheben scheint.

Hoffentlich sollte der Fix Teil der nächsten ODAC-Version sein (die letzte verfügbare Version ist ab Oktober 2015).

Wenn Sie diesen Fehler in Ihrer Anwendung sehen, liegt dies wahrscheinlich an demselben Fehler in der verwalteten ODP.net-Bibliothek, nicht an der Art, wie Sie ihn verwenden.

3
vc 74

Nachdem Sie eine ähnliche Frage unter ODP.NET Oracle.ManagedDataAcess random ORA-12570-Fehler durchgelesen haben , scheint es sich um ein Pooling-Problem zu handeln. Anscheinend besteht die Antwort darin, entweder Pooling=false in der Verbindungszeichenfolge festzulegen oder herauszufinden, wie viele Threads geöffnet werden können und wie lange die Verbindung geöffnet sein kann, bevor Oracle für die Verarbeitung überfordert ist. Dies war die Antwort des Autors dieser Frage:

Um die beste Konfiguration mit aktiviertem Pooling zu finden, habe ich eine Testanwendung zum Starten von 50 Threads (von denen jeder 1 Test alle 50 ms durchführt) erstellt und die Standard-Pool-Werte verringert, bis der Fehler beendet wurde. Auf diese Weise konnte ich eine optimale Konfiguration erhalten, stabil und fehlerfrei.

Natürlich gilt dies nicht für jeden Server, aber dies ist meine endgültige Konfiguration der Verbindungszeichenfolge:

Pooling=true;Min Pool Size=1;Connection Lifetime=180;Max Pool Size=50;Incr Pool Size=5

0
vapcguy