如何在SQL Server跟踪中跟踪调用代码?

时间:2011-08-03 13:32:06

标签: .net sql-server ado.net

我想使用SQL Server跟踪来跟踪有关使用数据库的代码的更多上下文。我打算在连接字符串上使用“Application Name”属性。看起来如下:

object CallingObject; //set elsewhere
SqlConnectionStringBuilder connectionString = GetConnectionString();
connectionString.ApplicationName = CallingObject.GetType().ToString();
using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
{
    // do your thing
}

除了大量的结果连接字符串意味着.net的连接池不再有效。

如何在不损失连接池优势的情况下跟踪SQL跟踪中的调用代码?

3 个答案:

答案 0 :(得分:3)

只要您使用的是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

稍后,当您想要“跟踪”连接时,可以将context-info的指定范围转换回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?

更新:

只有在重新阅读你的问题后,我才意识到你似乎只是明确地想要将信息添加到Traces,而不是那么多关于你当前连接的临时分析(这更像我使用的“申请名称“有,抱歉”;我见过的唯一有用的方法是sp_trace_generateevent调用。如果您打算这样做,我建议您同时添加connection_info,因为它不会再花费你了(你已经有了{{1}的数据库往返})并且肯定会在以后帮助您进行其他类型的分析。

答案 1 :(得分:1)

答案 2 :(得分:0)

为什么没有跟踪输出到数据库表(最好是在运行跟踪的不同机器/实例上)?这样,您可以根据您的参数查询跟踪表,查看哪些操作正在吸收所有CPU%,请参阅命令文本等等。