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