查询偶发时间过久、异常问题 返回

SqlSugar 待处理
1 139

现象:

查询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

  • 接口上下文几个读写数据库的位置通过获取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 回复