Oracle.DataAccess.Client.OracleException ORA-03135:连接丢失联系

Grz*_*nio 8 .net c# oracle database-connection odp.net

我有一个.Net服务,可以在每次请求时连接到Oracle数据库.它在开始时工作正常,但在我开始得到一些请求之后:

Oracle.DataAccess.Client.OracleException ORA-03135: connection lost contact
   at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure)
   at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src)
   at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
   at Oracle.DataAccess.Client.OracleCommand.ExecuteReader()
   at MyApp.Services.OracleConnectionWithRetry.ExecuteReader(OracleCommand command)
   ...
Run Code Online (Sandbox Code Playgroud)

知道可能是什么问题吗?我处理所有连接,结果和参数.这项服务的负担非常低.

san*_*iit 12

之所以发生这种情况,是因为您的代码从Oracle连接池请求连接,并且连接池返回与Oracle DB的断开连接/陈旧连接.ODP.NET本身不会测试发送给客户端的连接的连接状态.

因此,为了安全起见,connection status == Open当您执行Connection.Open()时,要么检查从池接收的连接

要么

让ODP.NET通过Validate Connection = true在web.config中设置连接字符串来为您进行检查.

这两种方法都会影响性能,因为每次需要连接数据库时都会测试连接状态.

我使用的第三个选项是使用例外.首先要乐观并使用从连接池返回的whateven连接.如果你得到一个ORA - 3135然后请求一个新连接并再次像while循环一样执行你的查询.在最好的情况下,您可以将第一个连接视为有效,并且您的查询将执行.在最坏的情况下,池中的所有连接都是陈旧的,在这种情况下,代码将在N次执行(其中N是连接池大小).