SQL连接字符串提示

655 阅读5分钟

本文打算就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();
            }
        }
    }
 
}

Using connection string in C#

我们可以在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

Monitor a connection in SQL Server

如何改变SQL连接字符串的语言

SQL服务器允许改变会话的语言设置。因此,这个选项将改变会话中的系统信息和日期时间格式。我们可以使用Language属性来改变连接字符串中的语言选项。在下面的SQL连接字符串中,我们将用波兰语改变默认的语言。

服务器=localhost;数据库=SQLShackDemo;用户ID=SuperHero;密码=1pass;语言=波兰语。

Monitor a connection in SQL Server

如何改变SQL连接字符串中的应用程序名称

应用程序名称有助于轻松识别哪个应用程序正在连接到SQL Server,否则会花费更多精力来识别应用程序的所有者。我们可以改变应用程序名称,在连接字符串中给出一个名称。

Server=localhost;Database=SQLShackDemo;User 
Id=SuperHero;Password=1pass;Language=Polish;

How to change program name in the connection string

如何在SQL连接字符串中改变客户工作站名称

在连接字符串中,我们可以改变连接机器的名称,使用工作站ID属性。在下面的连接字符串中,我们将设置机器名称为SuperNova。

Server=localhost;Database=SQLShackDemo;User Id=SuperHero;Password=1pass; 
Application Name=SuperApp

How to change the workstation name in the connection string

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个新连接并执行一个非常简单的查询。

Test the connection string

当我们运行这个控制台应用程序时,它将生成2个连接池。前3个连接将放在一个连接池中,后2个连接将放在另一个池中。

Perfmon and connection pool

这种情况可以使用PerfMon中SQL Server的.NET框架数据提供者的性能计数器来观察。参数NumberOfActiveConnectionPools显示了连接池的数量,NumberOfPooledConnections显示了这些池中管理的连接数量。

Monitoring connection pool

产生两个独立连接池的原因是连接字符串中的应用名称不同。连接字符串的不同导致产生独立的连接池。如不同的数据库名称、认证类型和其他差异导致产生不同的连接池。连接池不会被销毁,直到活动进程结束或超过了连接寿命。我们可以在连接字符串中设置连接寿命,它决定了一个连接将在连接池中保留多长时间。

Server=localhost;Database=SQLShackDemo;User Id=SuperHero;Password=1pass; 
Application Name=SuperApp;Workstation ID=SuperNova;Pooling=true; Connection Lifetime=100

在我们的示例程序中,我们在代码的最后有第六和第七个连接,他们的连接请求将从连接池中给出。为了监控所有这些复杂的过程,我们可以使用一个扩展事件。我们可以捕获登录/注销事件,我们也将捕获rpc_completed事件。启动应用程序后,扩展事件屏幕将被捕获,如下所示。

Using the extended events to monitor the SQL connections

正如我们所说,前5个连接创建了一个新的连接,由于应用程序名称不同,SQL服务器创建了两个连接池。当第六个连接请求一个连接时,这个连接是从第一个连接池中给出的,因为它们的连接字符串是相似的。同样,这种情况也适用于第七个连接。第七个连接是由第二个连接池提供的。如果is_cached值显示为真,这意味着连接是从连接池中给出的,这个值对于第六和第七个连接来说似乎是正确的。我们看到sp_reset_connection过程在logout事件后被执行。这个过程在logout和login事件之间被调用,因为它重置了连接的状态。

总结

在这篇文章中,我们已经探讨了关于SQL连接字符串的一些细节。正如我们所了解的,不同的连接字符串设置可以改变连接的行为。