本文打算就SQL连接字符串的使用细节给出一些有用的提示。
什么是SQL连接字符串?
连接字符串是一个表达式,包含应用程序连接数据库服务器所需的参数。就SQL Server而言,连接字符串包括服务器实例、数据库名称、认证细节和其他一些与数据库服务器通信的设置。
如何使用连接字符串连接SQL Server
我们可以使用下面的连接字符串来进行SQL Server的认证。在这种类型的连接字符串中,我们需要设置用户名和密码。
Server=ServerName;Database=DatabaseName;User Id=UserName;Password=UserPassword;
这种使用方式可能会导致我们的应用程序出现漏洞,因此使用windows认证可以为我们的应用程序提供更多的安全性。下面的连接字符串将使用windows认证连接数据库。
Server=ServerName;Database=DatabaseName;Trusted_Connection=True;
在以下C#代码的帮助下,我们可以看到连接字符串在应用程序中的使用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
namespace TestConnectionString
{
class Program
{
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection("Server=localhost;Database=SQLShackDemo;User Id=SuperHero;Password=1pass;"))
{
conn.Open();
Console.WriteLine("Connection is just opened");
System.Threading.Thread.Sleep(10000);
conn.Close();
}
}
}
}

我们可以在SQL Server中使用dm_exec_sessions视图来监控这个连接的细节。
SELECT
session_id
,program_name,
last_request_start_time,
last_request_end_time,
language,
date_format ,(select name from sys.databases where database_id =11) as ConnectedDatabase
FROM sys.dm_exec_sessions
where login_name ='SuperHero'
and is_user_process=1
如何改变SQL连接字符串的语言
SQL服务器允许改变会话的语言设置。因此,这个选项将改变会话中的系统信息和日期时间格式。我们可以使用Language属性来改变连接字符串中的语言选项。在下面的SQL连接字符串中,我们将用波兰语改变默认的语言。
服务器=localhost;数据库=SQLShackDemo;用户ID=SuperHero;密码=1pass;语言=波兰语。
如何改变SQL连接字符串中的应用程序名称
应用程序名称有助于轻松识别哪个应用程序正在连接到SQL Server,否则会花费更多精力来识别应用程序的所有者。我们可以改变应用程序名称,在连接字符串中给出一个名称。
Server=localhost;Database=SQLShackDemo;User
Id=SuperHero;Password=1pass;Language=Polish;
如何在SQL连接字符串中改变客户工作站名称
在连接字符串中,我们可以改变连接机器的名称,使用工作站ID属性。在下面的连接字符串中,我们将设置机器名称为SuperNova。
Server=localhost;Database=SQLShackDemo;User Id=SuperHero;Password=1pass;
Application Name=SuperApp
SQL连接字符串和连接池
对于SQL引擎来说,生成一个新的连接是一个有点资源密集型的任务。因此,SQL Server使用连接池机制来摆脱这项费力的任务。连接池的默认设置是true,因此,我们不需要改变任何东西来启用这个选项。然而,我们可以在连接字符串中明确地设置这个选项。
Server=localhost;Database=SQLShackDemo;User Id=SuperHero;Password=1pass;
Application Name=SuperApp;Workstation ID=SuperNova
连接池可以被比喻为一个连接缓存,因为在这个工作概念中,SQL SQL Server将准备好的连接放在池中使用,而不是销毁其任务完成后的连接。当用户请求一个具有匹配连接字符串的新连接时,池工作者会在池中寻找一个与该连接字符串相对应的可用连接。如果池工作者根据匹配的标准找到一个连接,它将这个准备好的连接返回给这个请求。当应用程序发送一个关闭连接的信号时,池工作者并没有关闭连接,而是将其发送到连接池中。在C#代码中,我们将请求7个新连接并执行一个非常简单的查询。

当我们运行这个控制台应用程序时,它将生成2个连接池。前3个连接将放在一个连接池中,后2个连接将放在另一个池中。
这种情况可以使用PerfMon中SQL Server的.NET框架数据提供者的性能计数器来观察。参数NumberOfActiveConnectionPools显示了连接池的数量,NumberOfPooledConnections显示了这些池中管理的连接数量。

产生两个独立连接池的原因是连接字符串中的应用名称不同。连接字符串的不同导致产生独立的连接池。如不同的数据库名称、认证类型和其他差异导致产生不同的连接池。连接池不会被销毁,直到活动进程结束或超过了连接寿命。我们可以在连接字符串中设置连接寿命,它决定了一个连接将在连接池中保留多长时间。
Server=localhost;Database=SQLShackDemo;User Id=SuperHero;Password=1pass;
Application Name=SuperApp;Workstation ID=SuperNova;Pooling=true; Connection Lifetime=100
在我们的示例程序中,我们在代码的最后有第六和第七个连接,他们的连接请求将从连接池中给出。为了监控所有这些复杂的过程,我们可以使用一个扩展事件。我们可以捕获登录/注销事件,我们也将捕获rpc_completed事件。启动应用程序后,扩展事件屏幕将被捕获,如下所示。
正如我们所说,前5个连接创建了一个新的连接,由于应用程序名称不同,SQL服务器创建了两个连接池。当第六个连接请求一个连接时,这个连接是从第一个连接池中给出的,因为它们的连接字符串是相似的。同样,这种情况也适用于第七个连接。第七个连接是由第二个连接池提供的。如果is_cached值显示为真,这意味着连接是从连接池中给出的,这个值对于第六和第七个连接来说似乎是正确的。我们看到sp_reset_connection过程在logout事件后被执行。这个过程在logout和login事件之间被调用,因为它重置了连接的状态。
总结
在这篇文章中,我们已经探讨了关于SQL连接字符串的一些细节。正如我们所了解的,不同的连接字符串设置可以改变连接的行为。





