Oracle版本:12.1.0.2
問題描述:
某B/S架構的應用程序在測試過程中每隔1到2小時出現“錯誤信息:ORA-03135: 連接失去聯系的報錯”,詳細報錯信息如下:
類名及方法:XXXX.XXT.Filter.ExtendedHandleErrorInfo\.ctor 第0行
錯誤信息:ORA-03135: 連接失去聯系
堆棧信息: 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, Int64 initialLOBFetchSize, Int64[] scnFromExecution, Boolean& bAllPureInputBinds, DataUnmarshaller& dataUnmarshaller, MarshalBindParameterValueHelper& marshalBindParamsHelper, Int64[]& rowsAffectedByArrayBind, Boolean bDefineDone, Boolean& bMoreThanOneRowAffectedByDmlWithRetClause, List`1& implicitRSList, Boolean bLOBArrayFetchRequired)
at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl& rdrImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Int64& internalInitialLOBFS, OracleException& exceptionForArrayBindDML, Boolean isDescribeOnly, Boolean isFromEF)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.ManagedDataAccess.Client.OracleDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
|
ORA-03135出現的原因較多,問題有可能出在網絡設備、操作系統、數據庫上,最有可能是由於網絡閃段和防火牆配置所導致。
解決方案:
經與網工溝通確認,當前防火前未開啟長連接設置,開啟后問題解決。
補充一下長連接和短連接的概念:
①長連接的概念
長連接功能用於設置特定數據流的超長保持時間,讓數據流的會話連接保持時間不受全局老化時間限制。其實這項特殊業務與目前業界的狀態防火牆的實現機制是存在矛盾的。
為保證內部網絡的安全,防火牆上的各會話缺省保持時間都相對較短,例如:缺省情況下,TCP的保持時間為1200s,UDP的保持時間為120s。
正常情況下,當一個TCP會話的兩個連續報文到達防火牆的時間間隔大於該會話的保持時間時,為保證網絡的安全性,防火牆將從會話表中刪除相應會話信息。后續報文到達防火牆后,防火牆根據自身的轉發機制,丟棄該報文,導致連接中斷。在實際應用中,用戶需要查詢服務器上的數據,這些查詢時間間隔遠大於TCP/UDP默認的會話保持時間。此時需要在防火牆上保持TCP連接一段相對較長的時間。當某會話的報文長時間沒有到達防火牆后再次到達時,仍然能夠通過防火牆,這種技術就是長連接。
②短連接的概念
某些應用頻繁發起連接,如果不縮短其會話保持時間,則會使防火牆的會話數爆漲,進而拖垮防火牆。保持太多的會話對防火牆沒有必要,相反,當系統資源過多地用在會話保持的話,會相應損害每秒生成會話的能力,這是一個同樣重要的性能指標。設定過高的會話數量,卻降低了每秒生成會話的能力,其結果,只能是保留一些永遠用不到的會話虛數而已。
因此,我們可以根據網絡應用環境的實際需求,縮短某些會話的保持時間,從而減少防火牆的工作負荷,提高網絡性能。
長、短連接概念參考資料:
-The end-
Tank
20170228