当使用 SQL Server .NET 数据提供程序连接池时,请注意以下几个方面:
• | 连接是通过连接字符串上的完全匹配算法进行池化的。池机制甚至对名称-值对之间的空格也敏感。例如,下面的两个连接字符串将导致两个独立的池,因为第二个连接字符串包含额外的空格字符。 SqlConnection conn = new SqlConnection( "Integrated Security=SSPI;Database=Northwind");conn.Open(); // Pool A is createdSqlConmection conn = new SqlConnection( "Integrated Security=SSPI ; Database=Northwind");conn.Open(); // Pool B is created (extra spaces in string) |
• | 连接池被划分为多个事务专有池和一个与当前尚未在事务中登记的连接对应的池。对于与特定事务上下文关联的线程,会返回相应池(该池包含在该事务中登记的连接)的连接。这就使得使用已登记的连接成为一个透明的过程。 |
OLE DB .NET 数据提供程序通过使用基础 OLE DB 资源池来池化连接。有多个用于配置资源池的选择:
• | 可以使用连接字符串来配置、启用或禁用资源池。 |
• | 可以使用注册表。 |
• | 可以用编程方式配置资源池。 |
为避免出现与注册表相关的部署问题,请不要使用注册表来配置 OLE DB 资源池。
要对应用程序使用连接池的情况进行监控,可以使用 SQL Server 随附的事件探查器工具,或者使用 Microsoft Windows? 2000 操作系统随附的性能监视器工具。
1. | 单击 Start,指向 Programs,指向 MicrosoftSQLServer,然后单击 Profiler 以启动事件探查器。 |
2. | 在 File 菜单上,指向 New,然后单击 Trace。 |
3. | 提供连接详细信息,然后单击 OK。 |
4. | 在 Trace Properties 对话框中,单击 Events 选项卡。 |
5. | 在 Selected event classes 列表中,确保 Audit Login 和 Audit Logout 事件显示在 Security Audit 下面。要使跟踪变得更为清晰,请从该列表中删除所有其他事件。 |
6. | 单击 Run 以启动跟踪。当连接建立时,您将看到 Audit Login 事件;当连接关闭时,您将看到 Audit Logout 事件。 |
1. | 单击 Start,指向 Programs,指向 Administrative Tools,然后单击 Performance 以启动性能监视器。 |
2. | 右键单击图形背景,然后单击 AddCounters。 |
3. | 在 Performance object 下拉列表中,单击 SQL Server:General Statistics。 |
4. | 在显示的列表中,单击 User Connections。 |
5. | 单击 Add,然后单击 Close。 |
尽管数据库连接池提高了应用程序的总体可伸缩性,但这意味着您不再能够在数据库级别管理安全性。这是因为,要支持连接池,连接字符串必须完全相同。如果您需要跟踪每个用户的数据库操作,请考虑添加一个参数,以便能够传递用户标识并在数据库中手动记录用户操作。您需要将该参数添加到每个操作中。
在连接到 SQL Server 时,应该使用 Windows 身份验证,因为它提供了许多好处:
1. | 安全性更易于管理,因为您使用单一 (Windows) 安全模型,而不是独立的 SQL Server 安全模型。 |
2. | 可避免将用户名和密码嵌入到连接字符串中。 |
3. | 不会以明文方式通过网络传递用户名和密码。 |
4. | 通过采用密码到期期限、最小长度以及在多次无效登录请求后锁定帐户,改善了登录安全性。 |
要存储数据库连接字符串,可以有多种选择,这些选择具有不同级别的灵活性和安全性。尽管在源代码中对连接字符串进行硬编码可提供最佳性能,但文件系统缓存可确保在外部将该字符串存储到文件系统中所带来的性能下降是微不足道的。几乎在所有情况下,人们都首选外部连接字符串所提供的额外的灵活性(它支持管理员配置)。
当您选择连接字符串存储方法时,需要注意的两个最重要的事项是安全性和配置简易性,然后紧跟着的是性能。
可以选择下列位置来存储数据库连接字符串:
• | 在应用程序配置文件中;例如,ASP.NET Web 应用程序的 Web.config |
• | 在通用数据链接 (UDL) 文件中(仅由 OLE DB .NET 数据提供程序支持) |
• | 在 Windows 注册表中 |
• | 在自定义文件中 |
• | 在 COM+ 目录中,方法是使用构建字符串(仅适用于服务组件) |
通过使用 Windows 身份验证来访问 SQL Server,可以避免将用户名和密码存储在连接字符串中。如果您的安全要求需要采取更严格的措施,请考虑以加密格式存储连接字符串。
对于 ASP.NET Web 应用程序而言,在 Web.config 文件内以加密格式存储连接字符串,代表着一种安全的、可配置的解决方案。
注 可以在连接字符串中将 Persist Security Info 命名值设置为 false,以禁止通过 SqlConnection 或 OleDbConnection 对象的 ConnectionString 属性返回对安全敏感的细节(如密码)。
下面几小节讨论了如何使用各种选择来存储连接字符串,并介绍了各种方法的相对优点和缺点。这些内容有助于您根据自己特定的应用程序方案做出明智的选择。
可以使用 <appSettings> 元素在应用程序配置文件的自定义设置节中存储数据库连接字符串。该元素支持任意的密钥-值对,如以下代码片段所示:
<configuration> <appSettings> <add key="DBConnStr" value="server=(local);Integrated Security=SSPI;database=northwind"/> </appSettings></configuration>
注 <appSettings> 元素出现在 <configuration> 元素下面,并且不是紧跟在 <system.web> 的后面。
• | 易于部署。连接字符串是通过定期 .NET xcopy 部署与配置文件一起部署的。 |
• | 易于以编程方式访问。通过 ConfigurationSettings 类的 AppSettings 属性,可以在运行时方便地读取已配置的数据库连接字符串。 |
• | 支持动态更新(仅限于 ASP.NET)。如果管理员在 Web.config 文件中更新连接字符串,当下一次访问该字符串时(对于无状态组件而言,这可能是客户端下一次使用该组件进行数据访问请求),所做更改将生效。 |
• | 安全性。尽管 ASP.NET Internet 服务器应用程序编程接口 (ISAPI) 动态链接库 (DLL) 禁止客户端直接访问带有 .config 文件扩展名的文件,并且可以使用 NTFS 权限进一步限制访问,您可能仍然希望避免以明文形式在前端 Web 服务器上存储这些详细信息。为获得额外的安全性,请以加密格式在配置文件中存储连接字符串。 |
可以使用 System.Configuration.ConfigurationSettings 类的静态 AppSettings 属性来检索自定义应用程序设置。以下代码片段对此进行了说明,该代码片段采用了前面例举的名为 DBConnStr 的自定义密钥:
using System.Configuration;private string GetDBaseConnectionString(){ return ConfigurationSettings.AppSettings["DBConnStr"];}
……