问题描述及重现代码:
运行以下批量更新代码的时候,出现了ExecuteAffrowsAsync(cts.Token)长时间未反馈的情况.通过dump分析运行堆栈可知,问题出现在打开数据库连接的方法 Oracle OpenAsync中.可能因为这边访问的数据库和业务服务器之间是跨网的,网络质量不太好导致的数据库连接偶发性的异常.经过运行堆栈分析,发现FreeSql 没有在 DbConnectionStringPool.GetAsync() 方法中传递 CancellationToken,希望可以优化下将CancellationToken入参.这样可以在我这边的特殊情况下也能取消代码的运行.
public static async Task UpdateStatusAsync(string status, params Sync_SJInSide[] sides)
{
try
{
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(120));
var freeSql = SyncContext.GetFreeSql();
var ids = sides.Select(a => a.ID).ToList();
await freeSql.Update().Where(a => ids.Contains(a.ID)).Set(a => a.Status, status).ExecuteAffrowsAsync(cts.Token);
}
catch (System.Exception e)
{
Logger.Error(e, "Sync_SJInSide UpdateStatus 更新状态出错!");
}
}
以下是dump出的信息在vs中内存分析的截图:
数据库版本
oracle 11i
安装的Nuget包
FreeSql 3.5.212
FreeSql.Provider.Oracle 3.5.212
Oracle.ManagedDataAccess 23.6.1
.net framework/. net core? 及具体版本
.Net Core 6.0.3624.51421