我有一个基本上更新单个 Oracle 表的约 30,000 行的过程。
我在 Sempahore 限制批次中同时执行此操作,一次 20 个。我目前将我的 OracleManagedDataAccess 连接池设置为 20 min pool size 和 200 max pool size。我在运行期间监控数据库,并且总是有 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
我的 UpdateMeterStatus 和数据库访问代码如下
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;
}
}
任何人都能够帮助弄清楚为什么它会抛出连接请求超时错误?我正在使用 Oracle.ManagedDataAccess 4.121.1.0