原文:.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);

****

在此我向大家推荐一个微服务架构学习交流群。交流学习群号:864759589  里面会分享一些资深架构师录制的视频录像:高并发、高性能、分布式、微服务架构的原理,分布式架构等这些成为架构师必备的知识体系。


**** 

### 引用链接

1. [口袋代码仓库](http://codeex.cn)

2. [在线计算器](http://jisuanqi.codeex.cn)

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

.net core 下监控Sql的执行语句的更多相关文章

  1. 监控SQL:执行表中所有sql语句、记录每个语句运行时间(3)

    原文:监控SQL:执行表中所有sql语句.记录每个语句运行时间(3) 通过执行一个 带参数的存储过程  exec  OpreateTB('OpreateUser','IsRun')  更新表的数据 表 ...

  2. SQL 2008执行语句遇到内存不足(1)——error 701

    原文:SQL 2008执行语句遇到内存不足(1)--error 701 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/17/sql-2008-e ...

  3. robot framework ——关键字run keyword if 如何在一个条件下接多个执行语句,以及如何写复杂条件句

    曾一度疯狂搜索run keyword if 的用法,帖子是挺多的,可惜,没有一个我想要的.现在我终于把我想要的用法,收集好了,在此总结下. 1.曾经天真的以为  run keyword if +条件 ...

  4. 拼接SQL执行语句时,对单引号的处理

    例: declare @SQL nvarchar(1000); declare @str nvarchar(100); set @str='Joe''s NB'; // 打印出来的应该是这样:Joe' ...

  5. SQL SERVER 执行计划各字段注释

    SET SHOWPLAN_ALL使 Microsoft® SQL Server™ 不执行 Transact-SQL 语句.相反,SQL Server 返回有关语句执行方式和语句预计所需资源的详细信息. ...

  6. 4.5 .net core下直接执行SQL语句并生成DataTable

    .net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs& ...

  7. .net core下直接执行SQL语句并生成DataTable

    .net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs& ...

  8. 应用Druid监控SQL语句的执行情况

    Druid是什么? Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBo ...

  9. 浅析SqlServer简单参数化模式下对sql语句自动参数化处理以及执行计划重用

    我们知道,SqlServer执行sql语句的时候,有一步是对sql进行编译以生成执行计划, 在生成执行计划之前会去缓存中查找执行计划 如果执行计划缓存中有对应的执行计划缓存,那么SqlServer就会 ...

随机推荐

  1. R语言-有负下标里才干有零

    1.仅仅有负下标里才干有零 先看一个样例 >a<-c(1,2,3,4) >a[-1:1] > a[-1:1] Error in a[-1:1] : 仅仅有负下标里才干有零 (1 ...

  2. jquery实现转盘抽奖

    jquery实现转盘抽奖 一.总结 一句话总结:这里环形转盘,环形的东西可以化成线性的,然后访问到哪个,给他加上背景为红的样式,用定时器开控制转盘的速度,函数执行的时间间隔越小,就运动的越快. 1.如 ...

  3. solr索引创建流程

    solr索引创建流程: 分词组件Tokenizer 分词组件(Tokenizer)会做以下几件事情(这个过程称为:Tokenize),处理得到的结果是词汇单元(Token). 1.将文档分成一个一个单 ...

  4. Android基于xmpp的即时通讯应用

    xmpp是一个通信协议.因为这是个开放的协议,为了节俭开发成本,很多即时应用都采用了这个协议.Android上最常用的组合asmack +openfire.Asmack是smack的android版, ...

  5. grep 过滤器基础

    grep是一种文本搜索工具,能使用正则表达式搜索文本,并把匹配的行显示出来. grep 选项 模式 文件 grep "bash" /etc/passwd 将/etc/passwd下 ...

  6. Redis的高级应用-事务处理、持久化、发布与订阅消息、虚拟内存使用

    三.事务处理 Redis的事务处理比较简单.只能保证client发起的事务中的命令可以连续的执行,而且不会插入其他的client命令,当一个client在连接 中发出multi命令时,这个连接就进入一 ...

  7. 删除dataGridview中选中的一行或多行

    一.实现的功能:可以删除一行或者多行数据,并在删除前提醒是否确定进行删除! DialogResult RSS = MessageBox.Show(this,"确定要删除选中行数据码?&quo ...

  8. POJ 2376 Cleaning Shifts 区间覆盖问题

    http://poj.org/problem?id=2376 题目大意: 给你一些区间的起点和终点,让你用最小的区间覆盖一个大的区间. 思路: 贪心,按区间的起点找满足条件的并且终点尽量大的. 一开始 ...

  9. System.Text.Encoding.Default

    string strTmp = "abcdefg某某某";int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;/ ...

  10. springboot入门(三)-- springboot集成mybatis及mybatis generator工具使用

    前言 mybatis是一个半自动化的orm框架,所谓半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完 ...