2014-11-25 6 views
12

В одном из наших продуктов мы извлекаем данные из базы данных Oracle, используя хранимые процедуры, используя управляемый драйвер ODP.net.Управляемый драйвер ODP.net выбрал ORA-12570: Сетевое сеанс: ошибка неожиданного чтения пакета

Каждый сейчас и потом (примерно через каждые 1000 запросов), мы получаем следующее исключение:

(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() 

Похоже, ODP.NET звонит System.Net.Sockets.Socket.Receive с недопустимым параметром размера (< = 0 или больше, чем длина буфера минус значение параметра смещения).

Исключение не может быть воспроизведено вручную и никогда не возникает при выполнении разных процедур с различными параметрами (т.е. оно случайное).

Конфигурация: ODP.net удалось версию драйвера: 4.121.1.0 .NET Framework 4.5 Oracle версии сервера: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 (Linux)

Кто-нибудь уже сталкивался с этим вопрос? Есть ли какие-либо исправления?

Заранее благодарен!

+1

когда-либо имели какие-либо решения этой @ vc_74 –

+0

Это не ваша ситуация, но та же ошибка произойдет при попытке использовать чистый управляемый драйвер Oracle при подключении к серверу, которому требуется расширенное шифрование (http://stackoverflow.com/a/34227815/12597) –

+0

Привет, вам удалось исправить это? Спасибо –

ответ

3

После открытия билета с поддержкой Oracle они отправили неофициальную обновленную версию управляемой библиотеки ODP.net, которая, похоже, устраняет проблему.

Надеемся, что исправление должно быть частью следующего выпуска ODAC (последнее из доступных сегодня - с октября 2015 года).

Если вы видите эту ошибку в своем приложении, это, вероятно, связано с той же ошибкой в ​​управляемой библиотеке ODP.net, а не с тем, как вы ее используете.

+1

Надеюсь, они исправили две другие ошибки, управление пулом и ошибки в блоке bytearray. (http://stackoverflow.com/questions/35352060/odp-net-oracle-manageddataacess-random-ora-12570-errors). Я попробую еще раз в следующем официальном выпуске. –

+0

@EdgarRochaCarvalho Что раздражает то, что они, похоже, не уделяют много внимания сообщениям, размещенным на их форумах, если у вас нет учетной записи поддержки, единственное, что вы можете сделать, это дождаться обновления –

+3

Oracle.ManagedDataAccess от nuget: 12.1.24160419 - та же проблема. – VikciaR

0

После просмотра аналогичного вопроса на ODP.NET Oracle.ManagedDataAcess random ORA-12570 errors, похоже, что это проблема пула. По-видимому, ответ заключается в том, чтобы либо установить Pooling=false в строке подключения, либо узнать, сколько потоков можно открыть и как долго можно открыть соединение, прежде чем станет слишком много для обработки Oracle. Это был ответ автора этого вопроса:

Чтобы найти лучшую конфигурацию с включенным пулом, я создал тестовое приложение для запуска 50 потоков (каждый из которых выполняет 1 тест каждые 50 мс) и уменьшил значения пула по умолчанию пока ошибка не будет остановлена. Таким образом, я смог получить оптимальную конфигурацию, стабильную и без ошибок.

Очевидно, что это не относится к каждому серверу, но это моя окончательная конфигурация строки соединения:

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