gpt4 book ai didi

c# - Oracle.DataAccess.Client.OracleException ORA-03135 : connection lost contact 错误

转载 作者:太空狗 更新时间:2023-10-29 18:19:22 27 4
gpt4 key购买 nike

我有一个 .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)
...

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

最佳答案

发生这种情况是因为您的代码请求来自 Oracle 连接池的连接,而连接池返回到 Oracle 数据库的断开连接/失效连接。 ODP.NET 本身并不测试发送给客户端的连接状态。

为了安全起见,您可以在执行 Connection.Open() 时检查 connection status == Open 以获取从池中接收的连接

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

这两种方法都会对性能产生影响,因为它们会在您每次需要连接到数据库时测试连接状态。

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

关于c# - Oracle.DataAccess.Client.OracleException ORA-03135 : connection lost contact 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3370078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com