C# OracleManagedDataAccess-即使在使用信号量时连接请求超时

C# OracleManagedDataAccess-即使在使用信号量时连接请求超时,c#,oracle,connection-timeout,odp.net-managed,C#,Oracle,Connection Timeout,Odp.net Managed,我有一个基本上更新单个Oracle表中约30000行的过程 我同时在Sempahore限制批次中执行此操作,每次20批。 我目前已将OracleManagedDataAccess连接池设置为最小池大小为20,最大池大小为200。我在运行过程中监视数据库,始终有20个打开的连接,但不会超过这个数目。然而,我仍然收到连接请求超时,这是不可预测的,有时我会超时,有时我不会。我的超时时间当前设置为30秒。 我不明白为什么我会超时。下面是我正在做的 List<Task

我有一个基本上更新单个Oracle表中约30000行的过程

我同时在Sempahore限制批次中执行此操作,每次20批。 我目前已将OracleManagedDataAccess连接池设置为最小池大小为20,最大池大小为200。我在运行过程中监视数据库,始终有20个打开的连接,但不会超过这个数目。然而,我仍然收到连接请求超时,这是不可预测的,有时我会超时,有时我不会。我的超时时间当前设置为30秒。 我不明白为什么我会超时。下面是我正在做的

                List<Task> tasks = new List<Task>();
                List<Meters> meters = GetMeters();
                int meterCount = meters.Count;
                using (SemaphoreSlim ss = new SemaphoreSlim(20))
                {
                    for (int i = 0; i < meterCount; i++)
                    {
                        ss.Wait();
                        string id = meters[i].ID;
                        tasks.Add(
                                    Task.Run(() =>
                                    {
                                        try
                                        {
                                            Meter m = _ammService.GetStatusInfo(id);
                                            if (!string.IsNullOrWhiteSpace(m.Status))
                                            {
                                                UpdateMeterStatus(m.ID, m.Status, m.StatusDate);
                                                updatedCount++;
                                            }
                                            else
                                            {
                                                Program.appLogger.logWarning($"No Meter Status found for: {m.ID}");
                                            }
                                        }
                                        finally
                                        {
                                            ss.Release();
                                        }

                                    })
                                );
                    }

                    Task.WaitAll(tasks.ToArray());
                }//End using Sempaphore Slim

是否有人能够帮助找出它抛出连接请求超时错误的原因?我正在使用Oracle.ManagedDataAccess 4.121.1.0

您是否尝试设置
cmd.Timeout
尝试将其设置为类似以下内容
cmd.CommandTimeout=60*22#MethodMan这是该命令的超时时间,命令本身花费的时间很少,它们只是更新一行中的几列。所以我不明白,如果我从来没有接近一个持续很长时间的命令,我为什么要增加这个时间限制。您认为UPP有帮助吗?您是否尝试过设置
cmd.Timeout
尝试将其设置为类似以下内容
cmd.CommandTimeout=60*22#MethodMan这是该命令的超时时间,命令本身花费的时间很少,它们只是更新一行中的几列。所以我不明白,如果我从来没有接近一个持续很长时间的命令,我为什么要增加这个时间限制。你有没有理由认为提高工资会有所帮助?
public int UpdateMeterStatus(string id, string status, DateTimeOffset statusTime)
    {
        OracleParameter[] oParams = new OracleParameter[]
        {
            new OracleParameter("id", id),
            new OracleParameter("status", status),
            new OracleParameter("statusTime", OracleDbType.TimeStampTZ, statusTime, ParameterDirection.Input) 

        };

        return executeStoredProcedure(oParams, InterfacePackage + "Update_Meter_Status");
    }

protected int executeStoredProcedure(OracleParameter[] oParams, string procName)
    {
        procName = schema + procName;

        try
        {
            using (OracleConnection con = new OracleConnection(connectionString))
            {
                using (OracleCommand cmd = new OracleCommand(procName, con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.BindByName = true;
                    cmd.Parameters.AddRange(oParams);
                    cmd.Connection.Open();
                    return cmd.ExecuteNonQuery();

                }
            }
        }
        catch (OracleException)
        {
            throw;
        }
    }