必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前事务中登记,等等。
连接池的优化方法。
Open 调用中重复使用。
还根据连接是否已在事务中登记来建立池连接。
有关更多信息,请参见本主题后面的“使用连接字符串关键字控制连接池”。
池的创建和分配
Initial Catalog 分配的值,第一个和第二个连接字符串有所不同。
using (SqlConnection connection = new SqlConnection( "Integrated Security=SSPI;Initial Catalog=Northwind")) { connection.Open(); // Pool A is created. } using (SqlConnection connection = new SqlConnection( "Integrated Security=SSPI;Initial Catalog=pubs")) { connection.Open(); // Pool B is created because the connection strings differ. } using (SqlConnection connection = new SqlConnection( "Integrated Security=SSPI;Initial Catalog=Northwind")) { connection.Open(); // The connection string matches pool A. }
非活动或空池的维护只需要最少的系统开销。
注意:当出现故障转移等错误时,会自动清除池。
添加链接
连接要可用,必须未使用,具有匹配的事务上下文或未与任何事务上下文关联,并且具有与服务器的有效链接。
如果池进程在连接超时之前无法满足请求,将引发异常。
注意:
不是显式关闭的连接可能不会添加或返回到池中。
Finalize 方法。
这是因为连接返回连接池时实际上没有关闭。
移除连接
发生此情况时,初次尝试使用该连接将检测连接是否曾断开,并引发异常。
清除池
连接关闭时,将被丢弃,而不是返回池中。
事务支持
如果在池的每个区域都没有可用的连接,则会创建一个新的连接并登记。
这样,您就可以在之后提交或中止分布式事务。
使用连接字符串关键字控制连接池
ConnectionString 属性支持连接字符串键/值对,可以用于调整连接池逻辑的行为。
池碎片
1、因为集成安全性产生的池碎片
这对特定 Web 应用程序结构会产生副作用,因为开发人员必须衡量安全性和审计要求。
2、因为许多数据库产生的池碎片
但是,每个数据库的连接存在一个独立的池,这会增加与服务器的连接数。
databaseName 字符串变量中指定的所需数据库。
// Assumes that command is a SqlCommand object and that // connectionString connects to master. command.Text = "USE DatabaseName"; using (SqlConnection connection = new SqlConnection( connectionString)) { connection.Open(); command.ExecuteNonQuery(); }
应用程序角色和连接池
应用程序角色替代项
如果您使用的是 SQL Server 2005,建议您使用可以替代应用程序角色的新安全机制。
ConnectionString 中的关键字值的有效名称。
|
关键字 |
默认值 |
说明 |
|---|---|---|
|
Addr |
不可用 |
“数据源”的同义词。 |
|
地址 |
不可用 |
“数据源”的同义词。 |
|
App |
不可用 |
“应用程序名称”的同义词。 |
|
Application Name |
不可用 |
应用程序的名称,或者“.Net SqlClient Data Provider”(如果不提供应用程序名称)。 应用程序名称可以有 128 个字符或更少。 |
|
Asynchronous Processing - 或 - Async |
'false' |
no。 |
|
AttachDBFilename - 或 - 扩展属性 - 或 - Initial File Name |
不可用 |
只有具有 .mdf 扩展名的主数据文件才支持 AttachDBFilename。 如果在连接字符串中指定了 AttachDBFileName 键的值,则附加数据库,且数据库成为连接的默认数据库。 之前连接的数据库将用作连接的默认数据库。 但是,如果该名称已在另一个附加数据库中使用,则此连接将失败。 如果使用 DataDirectory,则对应的数据库文件必须存在于替换字符串指向的目录的子目录中。 远程服务器、HTTP 及 UNC 路径名不受支持。
必须按照如下方式使用关键字“database”(或其别名之一)指定数据库名称: "AttachDbFileName=|DataDirectory|\data\YourDB.mdf;integrated security=true;database=YourDatabase" 附加了数据库后,系统将根据物理路径自动生成一个新的日志文件。 |
|
Connection Lifetime - 或 - Load Balance Timeout |
0 |
这在聚集配置中很有用(用于强制执行运行中的服务器和刚置于联机状态的服务器之间的负载平衡)。 零 (0) 值将使池连接具有最大的连接超时。 |
|
Connect Timeout - 或 - Connection Timeout - 或 - 超时 |
15 |
在终止尝试并产生错误之前,等待与服务器的连接的时间长度(以秒为单位)。 有效值大于或等于 0 且小于或等于 2147483647 。 |
|
Context Connection |
'false' |
true。 |
|
Current Language - 或 - Language |
不可用 |
设置用于数据库服务器的警告或错误消息的语言。 语言名称可以有 128 个字符或更少。 |
|
数据源 - 或 - 服务器 - 或 - 地址 - 或 - Addr - 或 - Network Address |
不可用 |
可以在服务器名称之后指定端口号: server=tcp:servername, portnumber 若要强制使用某个协议,请添加下列前缀之一: np:(local), tcp:(local), lpc:(local) 数据源必须使用 TCP 格式或命名的管道格式。 TCP 格式如下所示:
该主机名称“必须”按以下一种方式指定:
如果两个实例名称和端口号不存在,则使用默认的数据库实例。 Named Pipes 格式如下所示:
该主机名称“必须”按以下一种方式指定:
管道名称用于标识数据库实例,.NET Framework 应用程序将连接至该数据库实例。 如果 Network 键的值已指定,则前缀“tcp:”与“np:”不应指定。 但是,可以强制用 TCP 代替共享内存,方法是:向连接字符串中的服务器名称添加“tcp:”前缀,或者使用“本地主机”。
|
|
Encrypt |
'false' |
no。 |
|
Enlist |
'true' |
true 表明 SQL Server 连接池程序在创建线程的当前事务上下文中自动登记连接。 |
|
Failover Partner |
不可用 |
在其中配置数据库镜像的故障转移合作伙伴服务器的名称。
服务器名称可为 128 个字符或更少。 如果您指定故障转移合作伙伴,且未配置数据库镜像的故障转移合作伙伴,而且(用服务器关键字指定的)主服务器不可用, 则连接将失败。 如果您指定故障转移合作伙伴,且未配置数据库镜像的主服务器,那么主服务器可用时,(用服务器关键字指定)的主服务器的连接会成功。 .NET Framework 1.0 或 1.1 版不支持 Failover Partner 关键字。 |
|
Initial Catalog - 或 - 数据库 |
不可用 |
数据库的名称。 数据库名称可以有 128 个字符或更少。 |
|
Integrated Security - 或 - Trusted_Connection |
'false' |
true 时,将使用当前的 Windows 帐户凭据进行身份验证。 sspi(强烈推荐)。 如果指定了用户 ID 和密码,且集成安全性设置为 true,则用户 ID 和密码将被忽略,并使用集成安全性。 |
|
Min Pool Size |
0 |
池中允许的最大连接数。 此字段中的零 (0) 是指最初并未打开任何最小连接。 大于最大池大小的值将生成错误。 |
|
Max Pool Size |
100 |
池中允许的最大连接数。 小于最小池大小的值将生成错误。 |
|
MultipleActiveResultSets |
'false' |
false,则应用程序必须在执行该连接上的任何其他批处理之前处理或取消一个批处理中的多个结果集。 false。 .NET Framework 1.0 或 1.1 版不支持该关键字。 |
|
Network Library - 或 - 网络 - 或 - Net |
不可用 |
支持的值包括: dbnmpntw(命名管道) dbmsrpcn(多协议,Windows RPC) dbmsadsn (Apple Talk) dbmsgnet (VIA) dbmslpcn(共享内存) dbmsspxn (IPX/SPX) dbmssocn (TCP/IP) Dbmsvinn (Banyan Vines) 在此示例中,网络库为 Win32 Winsock TCP/IP (dbmssocn),使用的端口为 1433。 Network Library=dbmssocn;Data Source=000.000.000.000,1433;
|
|
Packet Size |
8192 |
用来与 SQL Server 的实例进行通信的网络数据包的大小,以字节为单位。 包大小可以大于或等于 512 并小于或等于 32767。 |
|
密码 - 或 - PWD |
不可用 |
Trusted_Connection 关键字。 密码必须为 128 个字符或更少。 |
|
Persist Security Info - 或 - PersistSecurityInfo |
'false' |
no。 |
|
Pooling |
'true' |
在下一次尝试打开相同的连接时,该连接将会从池中被绘制。 不同连接具有不同连接字符串。
|
|
复制 |
'false' |
true。 |
|
Transaction Binding |
Implicit Unbind |
System.Transactions 事务关联的连接。 可能的值包括: Transaction Binding=Implicit Unbind; Transaction Binding=Explicit Unbind; 事务结束后,其他请求将以自动提交模式执行。 InvalidOperationException。 InvalidOperationException。 |
|
TrustServerCertificate |
'false' |
连接字符串语法 (ADO.NET)。 |
|
Type System Version |
不可用 |
可能的值包括: Type System Version=SQL Server 2000; Type System Version=SQL Server 2005; Type System Version=SQL Server 2008; Type System Version=Latest; 与 SQL Server 2005 实例连接时,执行下列转换: XML 与 NTEXT UDT 到 VARBINARY VARCHAR(MAX)、NVARCHAR(MAX) 和 VARBINARY(MAX) 分别与 TEXT、NEXT 和 IMAGE。 对 ADO.NET 的当前版本不进行任何转换。 这个最新版本将随着客户端和服务器组件的升级自动更新。 |
|
用户 ID - 或 - UID - 或 -
|
不可用 |
Trusted_Connection关键字。 用户 ID 所包含的字符数不能超过 128 个。 |
|
User Instance |
'false' |
一个值,用于指示是否将连接从默认的 SQL Server Express 实例重定向到调用方帐户下运行的运行时启动的实例。 |
|
Workstation ID - 或 - WSID |
本地计算机名称 |
连接到 SQL Server 的工作站的名称。 ID 所包含的字符数不能超过 128 个。 |
SQL Server 连接池 (ADO.NET)。
-
Connection Lifetime(或 Load Balance Timeout)
-
Enlist
-
Max Pool Size
-
Min Pool Size
-
Pooling
整数值表示为字符串。
注意:
因此,当连接到 SQL Server 时,它不支持 ODBC 数据源名称 (DSN) 的使用,因为它不添加 ODBC 层。
用于 SQL Server 的 .NET Framework 数据提供程序不支持通用数据链接 (UDL) 文件。
连接字符串生成器 (ADO.NET)。
示例
private static void OpenSqlConnection() { string connectionString = GetConnectionString(); using (SqlConnection connection = new SqlConnection()) { connection.ConnectionString = connectionString; connection.Open(); Console.WriteLine("State: {0}", connection.State); Console.WriteLine("ConnectionString: {0}", connection.ConnectionString); } } static private string GetConnectionString() { // To avoid storing the connection string in your code, // you can retrieve it from a configuration file. return "Data Source=MSSQL1;Initial Catalog=AdventureWorks;" + "Integrated Security=true;"; }