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

频繁出现ORA-12537错误求助:高并发下Oracle.ManagedDataAccess调用异常

解决ORA-12537: Network Session: End of file error 高并发异常

针对你遇到的高并发下调用Oracle存储过程触发ORA-12537错误的问题,结合你的环境(.NET Framework 4.7.2、IIS 10、Oracle 12c、Oracle.ManagedDataAccess 18.6/21.12),给出以下排查和修复方向:

1. 修正输出参数读取时机

你的代码中,输出参数的读取操作是在OracleConnection的using块外部执行的,这会导致连接关闭后尝试访问已释放的数据库资源,高并发下这种操作极易触发网络会话异常。

修改代码,在连接未关闭时读取输出参数:

try
{
    using (var conn = new OracleConnection(connString))
    {
        conn.Open();
        var cmd = new OracleCommand();
        cmd.CommandText = spName;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = conn;

        AttachParameters(cmd, paramArray);
        cmd.ExecuteNonQuery();

        // 必须在连接处于打开状态时读取输出参数
        var returnedFromSP = (string)(OracleString)paramArray[17].Value;
        // 在此处处理返回值,避免后续在连接关闭后访问参数
    }
}
catch (Exception ex)
{
    throw ex;
}

2. 优化连接池配置

默认的连接池参数可能无法支撑高并发场景,调整连接字符串中的连接池参数,确保连接复用和有效性:

Data Source=你的数据源;User Id=用户名;Password=密码;Max Pool Size=200;Min Pool Size=10;Connection Lifetime=300;Incr Pool Size=5;Decr Pool Size=2;Validate Connection=True;
  • Max Pool Size:根据并发量调整,建议高于峰值请求数
  • Validate Connection=True:从连接池取连接时自动验证有效性,避免使用已断开的连接
  • Connection Lifetime:设置连接最长存活时间,防止长期闲置连接被防火墙切断

3. 配置Oracle端网络参数

修改Oracle服务器的sqlnet.ora文件(通常位于$ORACLE_HOME/network/admin),添加以下参数防止连接被防火墙或网络设备中断:

SQLNET.EXPIRE_TIME=10
TCP_KEEPALIVE=ON
  • SQLNET.EXPIRE_TIME=10:每10分钟发送一次探测包,保持连接活跃
  • TCP_KEEPALIVE=ON:启用TCP保活机制,检测无效连接

同时检查数据库最大连接数是否足够:

SHOW PARAMETER processes;

如果当前值低于并发需求,调整init.ora或spfile中的processes参数并重启数据库。

4. 调整IIS应用池配置

  • 增大应用池的队列长度(默认1000,可根据并发量调整)
  • 调整应用池的最大工作进程数,避免单进程处理过多请求
  • 关闭不必要的应用池自动回收规则,防止回收时中断数据库连接

内容的提问来源于stack exchange,提问作者Rakibul Hasan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:22:05