zoukankan      html  css  js  c++  java
  • .net core 下监控Sql的执行语句

    原文:.net core 下监控Sql的执行语句

    最近在编写.net core程序,因为数据库从Sql Server 切换到 MySql的原因,无法直接查看sql的具体语句,随着业务量的剧增,痛苦也与日俱增,为了彻底解决该问题,我在github、stackoverflow等站点不断搜索,试图找到一个好的办法。

    搜索的结果大都是这样的:

     SHOW VARIABLES LIKE "general_log%";
     SET GLOBAL general_log = 'ON';

    好嘞,试过以后发现果然灵验,BUT,我没有权限操作mysql的计算机,my god,此路不通~~~~

    最近搜索时再次发现MiniProfiler库有更新~~

    dotnet core支持不错,终于看到希望了~~~

    那就开始集成吧,如果你是asp.net core工程,就参考文档吧,

    如果是控制台程序,那就按照步骤开始吧:

    step 1:安装nuget包 MiniProfiler.EntityFrameworkCore ,目前仍是alpha版本。

    【step 2】: 开启EF core的监控初始化 ,如果你使用EF Core的话

     var initializer = new DiagnosticInitializer(new[] { new RelationalDiagnosticListener() });
     initializer.Start();
                

    【step 2】:开启Dapper的链接监控初始化,如果你使用Dapper的话

      

    private DbConnection GetConnection()
    {
         DbConnection conn = new MySqlConnection(MySqlDBContextOptionBuilder.GetDbConnectionString(DbInfo));
         if (MiniProfiler.Current != null)
         {
           conn = new StackExchange.Profiling.Data.ProfiledDbConnection(conn, MiniProfiler.Current);
         }
          conn.Open();
          return conn;
    }

    step 3:启动监控,在你的执行代码上增加如下代码

    var profiler = MiniProfiler.StartNew(m);
    using (profiler.Step("SqlProfile"))
    {
       // 你的代码
    }
    // 输出日志
    if (profiler?.Root != null)
    {
      var p = profiler.Root;
      Trace.WriteLine($"{p.Name}:{p.Id},{p.DurationMilliseconds} ms");
      if (p.HasChildren)
      {
        p.Children.ForEach(x =>
        {
          Trace.WriteLine($"{p.Name}:{x.Name},st:{x.StartMilliseconds} ms,exec:{x.DurationMilliseconds} ms");
          if (x.CustomTimings?.Count > 0)
          {
            foreach (var ct in x.CustomTimings)
            {
              Trace.WriteLine($"{p.Name}:Start {ct.Key} ---  ");
              ct.Value?.ForEach(y =>
              {
                Trace.WriteLine($"{p.Name}:{y.CommandString}");
                Trace.WriteLine($"{p.Name}:Execute time :{y.DurationMilliseconds} ms,Start offset :{y.StartMilliseconds} ms,Errored :{y.Errored}");
              });
              Trace.WriteLine($"{p.Name}:End {ct.Key} ---  ");
            }
          }
        });
      }
    }
    
    
    profiler?.StopAsync(true).ConfigureAwait(false);
    var profiler = MiniProfiler.StartNew(m);
    using (profiler.Step("SqlProfile"))
    {
       // 你的代码
    }
    // 输出日志
    if (profiler?.Root != null)
    {
      var p = profiler.Root;
      Trace.WriteLine($"{p.Name}:{p.Id},{p.DurationMilliseconds} ms");
      if (p.HasChildren)
      {
        p.Children.ForEach(x =>
        {
          Trace.WriteLine($"{p.Name}:{x.Name},st:{x.StartMilliseconds} ms,exec:{x.DurationMilliseconds} ms");
          if (x.CustomTimings?.Count > 0)
          {
            foreach (var ct in x.CustomTimings)
            {
              Trace.WriteLine($"{p.Name}:Start {ct.Key} ---  ");
              ct.Value?.ForEach(y =>
              {
                Trace.WriteLine($"{p.Name}:{y.CommandString}");
                Trace.WriteLine($"{p.Name}:Execute time :{y.DurationMilliseconds} ms,Start offset :{y.StartMilliseconds} ms,Errored :{y.Errored}");
              });
              Trace.WriteLine($"{p.Name}:End {ct.Key} ---  ");
            }
          }
        });
      }
    }
    
    
    profiler?.StopAsync(true).ConfigureAwait(false);

    3. 本节源码:[github](https://github.com/webmote-org/)

     
  • 相关阅读:
    好用的辅助工具
    摆脱单体架构黑洞>>>>走向微服务的乐园
    什么是 jQuery 事件
    WebDriver一些常见问题的解决方法【转】
    IE浏览器相关的问题及解决方案[转]
    fix org.openqa.selenium.NoSuchWindowException when find element on ie11.
    BI案例:BI在连锁零售业应用(ZT)【转】
    SQL 基础语法(创建表空间、用户、并授予权限、数据的增删改查) --(学习笔记)[转]
    创建数据库和表的SQL语句【转】
    T-sql语句中GO的作用及语法【转】
  • 原文地址:https://www.cnblogs.com/webenh/p/13128826.html
Copyright © 2011-2022 走看看