加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

.net – 如何跟踪SQL Server跟踪中的调用代码?

发布时间:2020-12-12 16:56:21 所属栏目:MsSql教程 来源:网络整理
导读:我想使用SQL Server跟踪来跟踪有关使用数据库的代码的更多上下文.我将使用连接字符串上的“应用程序名称”属性.看起来像下面这样: object CallingObject; //set elsewhereSqlConnectionStringBuilder connectionString = GetConnectionString();connectionSt
我想使用SQL Server跟踪来跟踪有关使用数据库的代码的更多上下文.我将使用连接字符串上的“应用程序名称”属性.看起来像下面这样:
object CallingObject; //set elsewhere
SqlConnectionStringBuilder connectionString = GetConnectionString();
connectionString.ApplicationName = CallingObject.GetType().ToString();
using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
{
    // do your thing
}

除了连接字符串的种类繁多,这意味着.net的连接池不再有效.

如何跟踪SQL Trace中的调用代码,而不会失去连接池的好处?

解决方法

只要您使用SQL Server,并且只要拥有(或可以拥有)集中式连接创建逻辑,就可以使用CONTEXT_INFO功能: http://msdn.microsoft.com/en-us/library/ms187768.aspx

我们做这样的事情来跟踪多用户服务器端应用程序中的数据库连接.每次创建新的数据库连接(从ADODB / ADO.Net代码中重新使用连接池,但是“创建”):

DECLARE @ContextInfoBinary binary(128); 
SET @ContextInfoBinary = Convert(Binary(128),'XX' + Replicate(Char(0),36) + 'Up to 90 characters of connection info - username,page,action,etc') 
SET CONTEXT_INFO @ContextInfoBinary

稍后,当您要“跟踪”连接时,可以将指定的上下文信息范围转换回VarChar内容:

SELECT RTRIM(hostname) AS hostname,hostprocess,RTRIM(program_name) AS program_name,CASE 
        WHEN SubString(Context_Info,1,2) = 0x5858
            THEN Replace(Convert(VarChar(90),SubString(Context_Info,39,90)),CHAR(0),'')
        ELSE 'UNKNOWN' 
        END AS ExtendedConnectionDescription
    --More stuff here,depending on what you're looking for
FROM master.sys.sysprocesses

一些注意事项

>我们特意因为应用程序名称功能的连接池问题而转移到这个概念.在任何给定的时间点,能够跟踪阻塞原因至特定的用户和进程是非常重要的.
>这将添加一个DB命令,为每个创建的连接执行 – 这可能或可能不代表重大的开销,具体取决于您的应用程序设计
>此示例使用VarChar(最多90个字符);如果您需要跟踪NVarChar(扩展字符)数据,您的空间将下降到45个字符
>在这个例子中,我们将留下36个字节,这些字节可以用于某些其他目的,例如用于防止触发器对某些连接执行.
>可以使用sp_trace_generateevent显式地将值输出到跟踪,如相关问题所述:How do you access the Context_Info() variable in SQL2005 Profiler?

更新:

只有在重新阅读你的问题之后,我才意识到你似乎正在明确地将信息添加到跟踪中,而不是为了对当前连接进行特别分析(这更多的是我使用“应用程序名称”)对不起);我看到的唯一有用的方法是sp_trace_generateevent调用.如果你打算这样做,我建议你也添加connection_info,因为它不会再花费你(你已经有sp_trace_generateevent的db往返行程),一定会帮助你使用其他类型的分析后.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读