查询偶发时间过久、异常问题 返回
yushu3166 发布于1周前
现象:
查询Sys_Role表,偶发查询时间过久(5分钟)才出结果,或抛异常:
异常类型:InvalidOperationException
异常信息:无效操作。连接被关闭。
请问原因是什么?
表数据量:4行
转换后的查询语句:
SELECT [OrganizeId],[Category],[EnCode],[FullName],[Type],[AllowEdit],[AllowDelete],[SortCode],[Description],[DeleteMark],[EnabledMark],[CreatorTime],[CreatorUserId],[LastModifyTime],[LastModifyUserId],[DeleteTime],[DeleteUserId],[Id] FROM [Sys_Role] WITH(NOLOCK) WHERE Id in('1')
sqlsugar版本:5.1.4.214
net版本:10.0
sqlsugar使用依赖注入的作用域模式,接口调用后,各service也是使用作用域模式注入的。
以下是相关关键代码:
public virtual IEnumerable<T> GetListWhere(string where = null)
{
var query = Db.Queryable<T>();
Log4NetHelper.Debug("GetListWhere1");
if (!string.IsNullOrEmpty(where))
{
query = query.Where(where);
}
var r = query.ToList();//追踪日志发现在此处偶发查询时间过久(5分钟)才出结果,或抛异常
Log4NetHelper.Debug("GetListWhere2");
return r;
}
private readonly IUnitOfWork _unitOfWork;
private SqlSugarClient _dbBase;
private ISqlSugarClient _db//目的是让日志类的实体可通过特性配置使用另一个数据库,但在开发出问题期间与业务表共用一个数据库
{
get
{
string t = typeof(T).Name;
string dbConfigName = typeof(T).GetCustomAttribute<AppDBContextAttribute>(false)?.DbConfigName ?? "DefaultDb";
if (_dbBase == null)
{
throw new ObjectDisposedException(nameof(BaseSugarRepository<T>), "数据库连接已被释放");
}
dbConfigName = dbConfigName.ToLower();
try
{
Log4NetHelper.Debug($"GetISqlSugarClient 1 {dbConfigName}");
if (_dbBase.IsAnyConnection(dbConfigName))
{
var r = _dbBase.GetConnection(dbConfigName);
Log4NetHelper.Debug("GetISqlSugarClient 2");
return r;
}
else
{
Log4NetHelper.Debug("GetISqlSugarClient 3");
return _dbBase;
}
}
catch (Exception ex)
{
Log4NetHelper.Error($"获取数据库连接异常:{ex}");
return _dbBase;
}
}
}
/// <summary>
///
/// </summary>
public ISqlSugarClient Db
{
get { return _db; }
}
public virtual IEnumerable<T> GetListWhere(string where = null)
{
var query = Db.Queryable<T>();
Log4NetHelper.Debug("GetListWhere1");
if (!string.IsNullOrEmpty(where))
{
query = query.Where(where);
}
var r = query.ToList();
Log4NetHelper.Debug("GetListWhere2");
return r;
}
public BaseSugarRepository(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
_dbBase = unitOfWork.GetDbClient();
}public class UnitOfWork : IUnitOfWork
{
private readonly ISqlSugarClient _sqlSugarClient;
private bool _disposed = false;
/// <summary>
///
/// </summary>
/// <param name="sqlSugarClient"></param>
public UnitOfWork(ISqlSugarClient sqlSugarClient)
{
_sqlSugarClient = sqlSugarClient;
}
/// <summary>
/// 获取DB
/// </summary>
/// <returns></returns>
public SqlSugarClient GetDbClient()
{
return _sqlSugarClient as SqlSugarClient;
}
热忱回答(1)
-
yushu3166 VIP0
1周前接口上下文几个读写数据库的位置通过获取ISqlSugarClient实例对象的hashCode,可以确认发生异常“无效操作。连接被关闭。”时整个接口上下文用的都是同一个对象。
int dbHashCode = Db.GetHashCode();
日志如下:
行 24: [15:23:24.836] Debug 26309479986627141 方法:Validate,日志:GetUserByLogin的dbHashCode:54142499
行 33: [15:23:24.862] Debug 26309479986627141 方法:Validate,日志:GetByUserId的dbHashCode:54142499
行 39: [15:23:24.888] Debug 26309479986627141 方法:Validate,日志:_userSigninRepository.GetWhere的dbHashCode:54142499
行 71: [15:23:24.922] Debug 26309479986627141 方法:GetListWhereAsync,日志:GetListWhereAsync->Role的dbHashCode:54142499
行 77: [15:23:24.979] Debug 26309479986627141 方法:GetListWhereAsync,日志:GetListWhereAsync->Role发生异常的dbHashCode:54142499
0 回复