.net 如何在SQL Server跟踪中跟踪调用代码?
我想使用SQL Server跟踪来跟踪更多关于哪些代码正在使用数据库的上下文。我打算在连接字符串上使用“Application Name”属性。这看起来类似于以下内容:.net 如何在SQL Server跟踪中跟踪调用代码?,.net,sql-server,ado.net,.net,Sql Server,Ado.net,我想使用SQL Server跟踪来跟踪更多关于哪些代码正在使用数据库的上下文。我打算在连接字符串上使用“Application Name”属性。这看起来类似于以下内容: object CallingObject; //set elsewhere SqlConnectionStringBuilder connectionString = GetConnectionString(); connectionString.ApplicationName = CallingObject.GetType()
object CallingObject; //set elsewhere
SqlConnectionStringBuilder connectionString = GetConnectionString();
connectionString.ApplicationName = CallingObject.GetType().ToString();
using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
{
// do your thing
}
除了大量的连接字符串意味着.net的连接池不再有效之外
如何在SQL跟踪中跟踪调用代码而不失去连接池的好处?尝试以下工具:
Redgate性能分析器:点跟踪:
Visual Studio性能分析器:
只要您使用的是SQL Server,并且只要您有(或可以有)集中式连接创建逻辑,您就可以使用
上下文信息
功能:
我们这样做是为了跟踪多用户服务器端应用程序中的数据库连接。每次创建新的DB连接时(实际上是从连接池中重用,但在ADODB/ADO.Net代码中“创建”):
稍后,当您想要“跟踪”连接时,可以将指定范围的上下文信息转换回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\u trace\u generateevent
更新:
只有在重新阅读了你的问题之后,我才意识到你似乎只是明确地想在跟踪中添加信息,而不是对你当前的连接进行特别分析(对不起,这更像是我所说的“应用程序名”的用法);我所看到的唯一有用的方法是调用
sp\u trace\u generateevent
。如果你要这样做,我建议你也添加连接信息,因为这不会花费你更多的钱(你也准备好了sp\u trace\u generateevent
)的db往返),并且肯定会在以后帮助你进行其他类型的分析。为什么你不把跟踪输出到数据库表中呢(最好是在运行跟踪的机器/实例之外的其他机器/实例上)?这样,您就可以根据参数查询跟踪表,查看哪些操作占用了所有CPU%,查看其命令文本,等等。我有一个可能可行的想法,但是:您希望在跟踪中实现哪些关键内容?(这将告诉我这个想法是否成立)嗨,马克,我想收集一个跟踪信息,并使用该信息将x%的db活动归因于此代码,y%的db活动归因于此代码。(活动包括CPU、读、写、持续时间等)。嗯,好吧,数据挖掘。我不认为这是一个直接的“命中”,但对于代码路径分析来说(例如,基于每个请求)我们使用,这对于查找单个请求中的时间位置非常有用(例如)在您的情况下可能没有那么有用,也许是/FWIW,谢谢您对这一点的关注。我自己还没有测试过这一点,所以我没有提交答案,但是否可以在命令前面添加注释?例如:string.Format(“/*{0}*/\n{1}”,CallingObject.GetType().ToString(),myCommand)我想收集来自数据库服务器端的信息。虽然这些都是客户端跟踪。也有这个过程的安全分支,您可能或可能不想提供任意的应用程序。需要考虑的另外一个因素。谢谢。TAO。有一些后处理以匹配自定义事件。(用户配置:1)使用同一进程的统计数据。但我可以做到。嗯,这就是我计划要做的。除了这不能解决计算应用程序中调用/调用每个查询/存储过程的代码位这一棘手的部分外,首先,您应该尽量减少您构造和从代码调用的特殊查询的数量。您的数据访问层应该我95%的时间都在调用存储过程。在跟踪中,你可以看到哪个存储过程或查询正在运行。但是你想看看哪个代码在调用它吗???我相信你可以很快地了解到,给定跟踪的命令文本。嗨,冲浪者,感谢你在这个问题上花费时间e trace将告诉我正在运行的sql,而不是正在进行调用的C#类或程序集(请参阅问题中的代码示例,了解我试图捕获的信息类型).我想我在这个问题上没有说清楚。我应该补充一点,我们有几个产品-->几个数据访问层,它们调用重叠的存储过程…这就是我试图解决的问题。
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