【发布时间】:2020-01-24 18:55:14
【问题描述】:
问题:
基本上,更新语句出于某种原因无休止地等待(ExecuteNonQueryAsync())。 Insert 工作得很好,我尝试用硬编码参数硬编码一个简单的更新语句(没有 merge),同样故事,甚至试图删除 where 子句并更新所有行,同样的问题。
将commandTimeout设置为1s后,我设法识别出TimeoutException,为什么会这样?我不知道。
编辑:情节扭曲。 现在我有随机成功的更新,这更让我头晕目眩。 我基本上尝试了我能想到的所有可能的方案来识别问题中存在的任何模式,我唯一的结论是更新成功率是完全随机的......
仍然插入工作正常。
这是简化的代码部分。
public class CipCheckRepository : ICipCheckRepository
{
private string connectionString = "Data Source=****;User Id=****;PASSWORD=****;Persist Security Info=True;";
public CipCheckRepository()
{}
public async Task InsertOrUpdate(CipCheck cipCheck)
{
using (var uow = new UnitOfWork(connectionString))
{
using (var cmd = uow.CreateCommand())
{
cmd.CommandText = @"
MERGE INTO test
USING dual
ON (id = :CAD_ID)
WHEN MATCHED THEN
UPDATE SET value = :ISRA_NUMBER
WHEN NOT MATCHED THEN
INSERT
(
id,
value
)
VALUES
(
:CAD_ID,
:ISRA_NUMBER
)";
cmd.Parameters.AddWithValue("CAD_ID", 1);
cmd.Parameters.AddWithValue("ISRA_NUMBER", cipCheck.IsraNumber);
cmd.CommandTimeout = 1;
try
{
await cmd.ExecuteNonQueryAsync();
}
catch (OracleException ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
}
}
UnitOfWork 类是为抽象事务而创建的。
如何确定永无止境的查询的原因以及可以采取哪些措施来防止它?
【问题讨论】:
-
一秒钟的超时时间并不长。虽然您希望在大多数情况下它会比这快很多,但由于服务器负载或如果您的查询特别慢,它可能很容易花费一秒钟以上。 15 或 30 秒的超时更合理。您是否直接对 DB 运行相同的命令以消除 C# 在此处成为问题,并查看需要多长时间?使用 Toad 或 Tora 或 SQLPlus 等。
-
我也尝试过 60 秒的超时,是的,我尝试在 oracle 开发人员中运行它。我提到我尝试将此语句简化为简单的基本 UPDATE 的部分,甚至删除 where 子句。
-
您尝试使用 Oracle Developer 运行它 - 结果如何?花了多长时间?另外,从哪里调用 CipCheckRepository.InsertOrUpdate?
-
结果令人满意,耗时 2ms。 CipCheckRepo 是从另一个类调用的,体系结构相当复杂,但我认为您不必为它烦恼,因为它在插入查询时工作得很好。但是仅供参考,还有另一个类正在解析 WCF 服务响应,创建实体类并将其传递给 InsertOrUpdate,它甚至更深入,但正如我所说,这一切都在插入新行时起作用。
-
我尝试的最后一件事是将ODP nuget更新到最新版本,没有运气。