通常,您不会将 Pi 计算到小数点后第 n 位,或是没事训练神经网络。您是在访问一个数据库,对它进行查询和更新,并且在访问数据库方面遇到麻烦。对数据访问技术的正确使用,加上对后端数据库的了解,对保持高性能和持续可扩展性需求很关键。下面是可能想从业务层考虑的一些问题。
使用最新版本的 Microsoft 数据访问组件
2000 附带了“Microsoft 数据访问组件 (MDAC) 2.5”。该 MDAC 版本包括了改进和增加的功能,例如不需要创建文件的 XML 集成、URL 资源支持和层次结构命名空间导航。
MDAC 2.5 也可用于运行 NT 4.0 和 Windows 9x 的计算机。参见下面的链接可以获得更详细的信息,并可。
MDAC 包括 MS ODBC 和 OLE DB 组件。请使用 MDAC 软件包中附带的最新版本组件。不要混合和匹配 ODBC 及 OLE DB 组件来创建“新口味”。MDAC 解决方案经过测试,并通过离散的 DLL 包进行部署。下面的关键词已经过测试。其他配置很有可能偶尔使用。
参考
从 可获得最新的 MDAC 版本和信息。
尽快将 ADO 对象关闭并设置为 Nothing
在使用 ADO 对象时,请确保在用完后立即显式调用 Close 方法并将使用的记录集和连接设置为 Nothing。一种最常见的 ADO 编码错误,是在用完对象后忘记关闭。虽然显式关闭对象不是强制的,但是这么做可能是成功或失败的应用程序之间的差别。
将 ADO 对象设置为 Nothing 会清除在 Err 中的错误信息。如果清除了错误处理程序中的 ADO 对象,可能会带来问题。因此,如果希望该信息,请在关闭对象之前的 ADO 对象清除过程中,将 Number、Source 和 Description 存入变量。
注意 如果要返回断开连接的记录集,则不应该关闭记录集。关闭记录集则会取消它的内部高速缓存,因此只要将它的 ActiveConnection 设置为 Nothing 就可以了。
操作方式
要确认是否正确关闭了 Connection 或 Recordset 对象,可以实现下面的代码:
If Not oMyRecordset Is Nothing Then
If oMyRecordset.State <> 0 Then oMyRecordset.Close
Set oMyRecordset = Nothing
End If
正如以前所提到的,不能在将返回给客户机的记录集中调用 Close 方法。
避免复用 ADO 连接对象来执行多个命令
避免在多个数据库命令上复用打开连接对象。也就是说,每当需要时请打开、使用和关闭连接。
在数据库访问对象中封装 ADO 代码是不会有问题的,原因是这些封装是在无状态方式下执行的。但是,如果对象中有 ADO 对象,尤其是在类级别上存储了 ADO 连接,那么请参考下面的“知识库”文章。主要问题在于如何在执行其他任务时保持打开的数据库游标。如果正在检索要发送到客户机的记录集,那么请从 RDBMS 断开它们的连接。
实现一种复用 ADO 连接对象的方式会大大加重维护任务,并且可能导致通过良好封装能够避免的设计错误。ADO-OLE DB 层实现了它自己的内部连接池。该连接池使下面的流程成为访问上数据的首选方式:
创建 ADO 连接
打开连接
使用它
关闭连接
将 ADO 连接对象设为 Nothing
开发和维护将更方便,并且更快速和可扩展。
使用 OLE DB 提供程序而不是 ODBC 驱动程序
在通过 ADO 使用 OLE DB 时,可以选择使用本机 OLE DB 提供程序,或者选择能够转换并将所有调用转发给 ODBC 驱动程序的指定的 OLE DB 提供程序(MSDASQL — 即“OLE DB Provider for ODBC Drivers”) 。
如果有的话,可以使用能够与数据库进行本机对话的 OLE DB 提供程序,以便获得更高的性能、更多功能、转发兼容性以及参与活跃的 OLE DB 第三方解决方案市场。
操作方式
如果下面的任何条件为真,就说明正在使用 ODBC:
您在 ODBC 管理单元中配置“系统”、“用户”或“文件 DSN”以便使用某个应用程序。
您的连接字符串中包括“MSDASQL”或“DSN”。
没有在连接字符串中指定提供程序。
如果使用的是 ODBC,请确定本机提供程序是否访问有相同功能支持的同一数据库。要查看的关键部位是:连接池、分布式事务支持等等。
参考
MDAC 伙伴领域:目前市场上的 OLE DB 产品(英文)
针对 ODBC 编程人员的 OLE DB(英文)
Merant Corporation(英文)
使用通用数据链接 (UDL) 文件来保存连接字符串
使用 UDL 文件存储数据库连接的方式和使用“ODBC 数据源名称 (DSN)”非常相似。UDL 文件存储 OLE DB 连接信息,例如提供程序、用户名、密码和其他选项。用存储在该 UDL 文件中的信息可以打开 ADO 连接,从而允许管理员在需要的情况下更改它,并且避免了打开注册表或者使用 ODBC。
确保软件包身份有权读取该文件,并且恰当的管理员有权读写该文件(实际上是编辑它)。如果是 Web 站点的情况,请确保 DLL 和 UDL 文件不在虚拟目录中,否则就可以通过 Web 直接访问和它们了。
要创建 UDL 文件,请创建一个空文件并用 UDL 扩展名命名它。通过双击该文件输入所有信息,然后在它的属性表中输入信息,如下面所示。
要用 UDL 打开 ADO 连接,请用以下语法:
oOConnection.Open "FILE Name=C:\SecureStuff\MyDataLink.UDL"
您可以要求管理员将 DLL 和 UDL 都放在同一目录中,在这种情况下必须对完整的 UDL 文件路径进行硬编码。如图 6 所示,您必须需要设置“允许”保存存储完整连接字符串的密码。系统会发出警告,指出您正以纯文本方式将密码存储在文件中。如果对此文件设置了正确的 NTFS 权限,这不会成为问题。
不要将 UDL 文件放在文件共享区中,以避免其他都能打开它。如果有许多服务器,请在每个服务器上保存一个 UDL 文件的副本。
图 6. 设置“允许”保存密码
性能可能是倍受关心的问题;毕竟这是对磁盘的访问,对吗?实际上在使用该技术时,文件系统将在内存中缓存该文件,而且强度测试表明,如果完全可以度量的话,在比较它访问“系统”或访问“文件 DSN”时,性能的下降是可以忽略的。
使用存储过程而不是动态 SQL 字符串
使用存储过程有许多优点,包括:
通过将概念数据命令与命令的实现隔离,添加来自数据库架构的抽象级别。存储过程还使应用程序代码减少耦合,使测试更方便。
提供更好的代码分布。与构造、发送和分析 SQL 字符串,加上上面的所有工作相比,包装参数和返回结果集的逻辑要更少。
由于它们的执行计划是预编译的,因此在运行时会更有效。动态 SQL 串必须包括能够使它们的查询计划优化缓存的参数。
允许更多的运行时灵活性 — 一旦被部署后,要更改在 DLL 中编译的 SQL 串,比更改存储过程更难。
由于它们的参数已经声明了方向和类型,因此允许更好的工程代码。
允许更好的配置。使存储过程限制在不同的应用程序/软件包标识或者限制在不同服务器应用程序上的不同连接串,通常是更容易维护些。
如果您已经用了存储过程,那么在需要改变时完成的速度会更快。
操作方式
添加存储过程是很方便的。只要查看 T-SQL 中的 CREATE PROCEDURE 语句,并按那些准则做就可以了。如果在数据访问对象的实现中选择使用存储过程,那么为了维护起见,请保持它们的一致性。请把它们作为一个整体使用或者完全不用。这有助于排除故障,有助于为今后的开发而构造的功能,不必预言动态 SQL 和存储过程的混合。
使用存储过程的 OUTPUT 参数以获得单行返回值
在从数据库查询中返回单项数据或者单行时,请使用 OUTPUT 参数而不是结果。OUTPUT 参数不使用在服务器上构造的任何游标/结果集,并且使组件和数据库之间能进行更有效的数据传输。
但是,根据体系结构的不同,您可能不希望单行或多行查询有不同的代码路径。必须同时考虑数据库架构的动态性。有了更强大的类型化存储过程后,它们就会更紧密地耦合到您的数据库。和其他情况一样,灵活性和性能是密切相关的。
不要在单元之间传送 ADODB.Connection 对象
在数据库连接的交叉单元/进程汇集上需要注意一些问题。我们建议您不要这么做。汇集和数据库驱动程序的局限性,可能会引起一些意想不到的行为。
如果这么做,那么可能需要自己管理连接池并且实现自己的连接分配程序。在大多数情况下,自己提供池功能可能太困难了。通常情况下,即使是最严格的资源管理器,也会允许在同一单元上发生的不同活动上有不同的连接。如果 ODBC 驱动程序或者 OLE DB 提供程序允许池(通常是这样的),那么请关闭连接再在需要的时候打开它们,并且允许 OLE DB/ODBC 层提供基本结构。
如果使用交叉单元/进程汇集的原因是为了提供正确的连接串,那么请按前面讨论的方式,在 SPM 中存储字符串,然后按我们建议的方式重新在每个方法调用中创建连接。
记住 ACID 规则
请记住事务操作的规则,它通常
【责编:admin】
--------------------next---------------------