【问题标题】:Changing Application Name on SQL Server Connection在 SQL Server 连接上更改应用程序名称
【发布时间】:2012-01-22 07:36:36
【问题描述】:

连接打开后是否可以更改传递给 SQL Server(通过 ADO 连接字符串)的应用程序名称,而无需关闭并重新打开连接?

特别是,我使用的是 ADO,而不是 ADO.NET,以及 SQLOLEDB.1 OLE DB Provider。

我们将会话信息嵌入到应用程序名称中,以帮助我们识别特定于用户会话的连接。这主要有助于解决错误查询或性能问题。

我们目前不为 ADO 连接使用连接池。我正在考虑实现一个连接池,但希望在从池中删除连接时更新应用程序名称,以便我们在应用程序名称中获得准确的会话信息。

【问题讨论】:

    标签: sql-server connection-string oledb ado


    【解决方案1】:

    我建议使用 SQL CONTEXT_INFO,每个连接可用 128 个字节,可以在运行时更改:http://msdn.microsoft.com/en-us/library/ms189252%28v=sql.105%29.aspx

    【讨论】:

    • 我刚刚注意到您的回答,所以对于迟到的回复深表歉意。非常有趣的建议。通过 SQL Profiler 访问并不是特别容易,这是我试图完成的主要目的(在解决性能问题时)。但这应该是可能的,基于this answer
    【解决方案2】:

    我怀疑您是否可以在创建连接后更改连接字符串的任何属性(在池中或不在池中)。根据连接字符串本身的值,连接是assigned 到池,因此如果您可以在从池中选择连接后更改应用程序名称,那么从那时起,它基本上属于不同的池,这将可能会在内部搞乱连接池管理。

    此外,应用程序名称被用作(我想您已经知道,正如您所说,您正在尝试将其用于性能和故障排除原因)来填充sys.dm_exec_sessionsprogram_name 列。因此,除非有一种方法可以改变此值以用于现有连接,否则我认为 ADO.NET 也无法做到这一点。

    话虽如此,我将应用程序名称用于相同目的。我只是将应用程序名称“硬编码”为一些符号字符串(例如“myapp-client”),这一直足以在拥挤的服务器上计算出确切的调用应用程序(至少连同sys.dm_exec_sessionshost_process_id 列一起) )。

    【讨论】:

    • 感谢您的回复。可悲的是,我没有意识到 ADO 有它自己的连接池(我认为它与 ADO.NET 一起出现)。所以我花了一些时间调查和考虑这些选项。我们的架构是这样的,一旦用户接收到 ADO 连接,该连接就会保持打开状态(在我们的服务器中),直到用户注销。更改体系结构以允许 ADO 汇集连接并不是一个简单的选择。我一直的想法是创建自己的连接池,这仍然是我的计划。
    • 也就是说,我们将添加在服务器运行时打开或关闭连接池的功能。如果我们需要解决问题并需要跟踪用户的数据库活动,我们将关闭连接池,新连接将在 sysprocesses.program_name 中包含用户名。当用户登录时,将根据当前是否启用连接池来配置他们的连接。打开/关闭它不会改变现有连接的行为。
    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多