利用在AOP中记录sql日志,是否可以用Task? 返回

SqlSugar 沟通中
8 729
该叫什么 历历 发布于2024/6/6
悬赏:0 飞吻

老师,发现一个问题,如果在AOP的委托方法中记录日志时,使用了Task.Run的话,会造成整个项目运行的卡顿。您遇到过吗?

image.png

热忱回答8

  • image.png 在这个里面加task.Run

    0 回复
  • 还有疑问提供DEMO

    0 回复
  • 历历 历历 VIP0
    2024/6/6

    @fate sta:就是在这里面加的 老师。

            public static void OnLogExecutedHandle(string sql, SugarParameter[] pars)

            {

                Task.Run(() =>

                {

                    // 替换sql语句中的\f\n\r\t\v

                    //sql = Regex.Replace(sql, @"\s", " ");

                    // 替换sql语句中的参数,如果要将oracle的日期类型参数前加to_date函数,请使用下面自己写的私有方法ReplaceSQLPars

                    // 这个方法是sqlsugar自带的,兼容性好,但是性能比较差

                    string replSql = UtilMethods.GetSqlString(DbType.Oracle, sql, pars);

                    // 输出Nlog日志

                    //logger.Info(replSql);


                    // 通过Eventbus将日志发布到MQ

                    IntegrationEvent? @event = GetDbLogEventType(replSql, "Info");

                    if (@event != null)

                    {

                        var eventBus = AppHttpContext.GetSerivce<IEventBus>();

                        eventBus.Publish(@event);

                    }


                    // 控制台日志,调试用,正式环境请注释,比较影响性能

                    Console.WriteLine(replSql + "\r\n");

                });

            }


    去掉Task之后,虽然记日志慢了,但是不影响整体了


    0 回复
  • 看不出问题,需要DEMO

    0 回复
  • 历历 历历 VIP0
    2024/6/6

    @fate sta:demo太大,不好提供 老师。写法就是上面的写法,感觉是不出问题,但是加上Task.Run后,确实是记日志虽然快了,但是会造成其他读数据接口十几二十秒的卡顿,去掉Task.Run后,这种情况就好了。 感觉是不是Db对象释放的问题?

    0 回复
  • 历历 历历 VIP0
    2024/6/6

    @fate sta:用的是单例模式的SqlSugarScope

    0 回复
  • @历历:不清楚你的实现task.run 要看你怎么写的,有没有数据库操作等,如果没有数据库操作是不会有影响的

    0 回复
  • 历历 历历 VIP0
    2024/6/6

    @fate sta:明白,我是通过 Rabbitmq 和 Nlog 向记事本写日志,我再研究下

    0 回复