You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#连接本地Oracle数据库时请求超时异常的解决方案

Oracle本地连接超时问题排查与解决

问题场景

已确认Oracle服务正常运行(无监听器错误)、SQL Developer可正常连接本地数据库,尝试增加超时时间后,使用以下C#代码连接仍出现请求超时异常。

相关代码

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;
using Oracle.ManagedDataAccess.Client;

namespace FirstApp.BAL {
  public class DBManager: IDisposable {
    private OracleConnection _connection;

    public DBManager() {
      try {
        var connectionString = ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString;
        _connection = new OracleConnection(connectionString);
        _connection.Open(); // 测试对象创建时连接是否成功
      } catch (Exception ex) {
        // 捕获Oracle特定异常
        Console.WriteLine($"OracleException: {ex.Message}");
        // Console.WriteLine($"Oracle Error Code: {ex.ErrorCode}");
        Console.WriteLine($"Stack Trace: {ex.StackTrace}");
      }
    }
    public T ExecuteStoredProcedure < T > (string storedProcedure, SqlParameter[] parameters, Func < IDataReader, T > mapFunction) {
      try {
        _connection.Open();
        OracleCommand command = new OracleCommand(storedProcedure, _connection);
        command.CommandType = CommandType.StoredProcedure;

        if (parameters != null) {
          command.Parameters.AddRange(parameters);
        }

        using(OracleDataReader reader = command.ExecuteReader()) {
          if (reader.HasRows) {
            return mapFunction(reader); // 将结果映射到对象
          } else {
            return default; // 无结果时返回默认值
          }
        }
      } catch (Exception ex) {
        // 记录错误
        throw new ApplicationException("执行存储过程时发生错误。", ex);
      } finally {
        _connection.Close();
      }
    }

    public void Dispose() {
      throw new NotImplementedException();
    }
  }
}

解决步骤

  • 修复参数类型不匹配问题:ExecuteStoredProcedure方法接收的是SqlParameter[](SQL Server参数类型),但实际使用OracleCommand执行,需替换为OracleParameter[],否则参数无法正确绑定,可能导致存储过程执行异常或超时。
  • 避免重复打开连接:构造函数中已调用_connection.Open(),但ExecuteStoredProcedure中再次执行该方法。若连接已处于打开状态,重复调用可能引发异常,建议添加状态检查:
    if (_connection.State != ConnectionState.Open)
    {
        _connection.Open();
    }
    
  • 正确实现IDisposable接口:当前Dispose方法未释放连接资源,易导致连接池耗尽引发超时,修正实现:
    public void Dispose()
    {
        if (_connection != null)
        {
            if (_connection.State != ConnectionState.Closed)
            {
                _connection.Close();
            }
            _connection.Dispose();
            _connection = null;
        }
        GC.SuppressFinalize(this);
    }
    
  • 验证连接字符串配置:确保使用Oracle托管驱动的正确格式,确认Connection Timeout、SERVICE_NAME等参数与SQL Developer一致,示例:
    Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=your_username;Password=your_password;Connection Timeout=30;
    
  • 排查存储过程性能:在SQL Developer中手动执行目标存储过程,确认是否存在执行缓慢、死锁或逻辑问题。若存储过程本身耗时过长,需优化其SQL语句或索引。
  • 启用驱动日志定位问题:在配置文件中添加Oracle托管驱动的日志配置,捕获详细的连接和执行细节:
    <configuration>
      <system.diagnostics>
        <trace autoflush="true" />
        <sources>
          <source name="Oracle.ManagedDataAccess.Client" switchValue="Information">
            <listeners>
              <add name="oracleTrace" type="System.Diagnostics.TextWriterTraceListener" initializeData="OracleTrace.log" />
            </listeners>
          </source>
        </sources>
      </system.diagnostics>
    </configuration>
    

内容的提问来源于stack exchange,提问作者malik hammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:39:54