Skip to content

DbConnectionStringPool.GetAsync() 方法中没有传递 CancellationToken,不良网络状况下可能导致sql无法继续 #2177

@w-jj

Description

@w-jj

问题描述及重现代码:

运行以下批量更新代码的时候,出现了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中内存分析的截图:

Image

数据库版本

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions