显式地释放你的ADO对象

ado|对象

在真实的生活里,程序员天生懒惰. 这个事实使我们经常深陷BUG的泥塘. 尤其是当用ASP处理数据库连接时,它将让你感觉身处油锅.

在ASP里,我们建立数据库连接,然后用ADO获得数据查询的结果; 我们最常用到的是ADODB.Connection和ADODB.Recordset. 让我们看一个简单的例子来了解一下如何使用这两个对象:

Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "DSN=Northwind"
objConn.Open
Dim objRS
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open "SELECT * FROM Table1", objConn

如果你还不是很熟悉数据库连接的话,请先阅读这篇文章
(http://www.4guysfromrolla.com/webtech/faq/Databases/faq2.shtml).

我们从objRS开始讨论我们的主题. 当我们用完objRS之后会做些甚麽呢? 通常情况下程序员不再进行任何操作,他们让ASP去料理后事. 当Server.CreateObject调用发生后,服务器将分配资源来操作这些对象的新实例(instances),如果我们不显式地通知服务器我们不再使用这些分配的资源了,ASP应该为我们释放这些资源. 对ASP完全信任有点儿冒险. 更安全和更可信的办法是显式地关闭和清除我们的Recordset和
Connection对象的实例.

我们该怎么关闭我们的对象及释放掉所分配的内存呢? 我们所要做的全部事情就是当我们用完这两个对象后调用以下的四行代码:

objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing

这样将强制释放资源,远胜过依赖ASP隐式地自动释放. 现在,你可能会有些疑惑:我们这么做真的很重要吗? 谁会在每个用过数据库连接的ASP页面里多写四行代码呢? 这样做的好处远远超过多写四行代码给我们带来的负担. 让我们引用
ActiveServerPages.com(http://www.activeserverpages.com/)的站长的一些话:

"你应该关闭Recordset,设为Nothing,关闭Connection,用同样的次序将其设为
Nothing. 标准的资源碎片收集是不完全的和不可信的.[前面提到的碎片收
集,Charles指的是隐式地清除服务器分配的资源.]

"DataReturn[一个ASP webhosting公司]有许多站点依赖IIS自动进行碎片收集时出现可怕的错误. 在加上Close/Set Nothing的几行代码后,这些站点又象马儿一样欢快地跑起来. 所有的大站都有显式释放资源的硬性规定."

如果Charles的话还不能让你信服,让我们来讨论一个由于没有显式使用内存再分配而出现的问题,这是个真实的例子. Brian Fairchild用Access做后台数据库来支持一个ASP大站. 他发现每过一阵子时间,ASP页面就会完全停止相应! HTML页能正常显示,但所有的ASP页面完全瘫痪,系统不得不重启. 最后,Brian发现,显式地关闭和释放Recordset和Connection对象,故障就全部消失了. (看看消息板上Brian谈及此故障的文章)(http://www.aspmessageboard.com/forum/performance.asp?
M=1321&P=1&F=23)

Charles Carroll还告诉我们一个技巧,那些用Access的用户应该增加缺省的线程数目. 这儿就是Charles所说的:

"注册表里Access缺省的线程数是4. 把它加到20将会使服务器跑得出乎寻常的顺畅, 但只是对Access特别管用,我们的服务器的CPU占用率从上午8点到晚上5点都是100%,但我在增加了线程数以后,服务器上的CPU马上凉快了下来."

时间: 2024-12-21 21:57:40

显式地释放你的ADO对象的相关文章

C#的显式引用转换

显式引用转换包括: ●从对象到任何引用类型 ●从类类型S到类类型T,其中S是T的基类. ●从基类型S到接口类型T,其中S不是密封类,而且没有实现T. ●从接口类型S到类类型T,其中T不是密封类,而且没有实现S. ●从接口类型S到接口类型T,其中S不是T的子接口. 从元素类型为Ts的数组类型S到元素类型为Tt的数组类型T的转换,这种转换需要满足下列条件: ●S和T只有元素的数据类型不同,而维数相同. ●Ts和Tt都是引用类型. ●存在从Ts到Tt的显式引用转换. ●从System.Array到数组

《C++编程规范:101条规则、准则与最佳实践》——2.9 确保资源为对象所拥有。使用显式的RAII和智能指针

2.9 确保资源为对象所拥有.使用显式的RAII和智能指针 摘要利器在手,不要再徒手为之:C++的"资源获取即初始化"(Resource Acquisition Is Initialization,RAII)惯用法是正确处理资源的利器.RAII使编译器能够提供强大且自动的保证,这在其他语言中可是需要脆弱的手工编写的惯用法才能实现的.分配原始资源的时候,应该立即将其传递给属主对象.永远不要在一条语句中分配一个以上的资源. 讨论C++语言所强制施行的构造函数/析构函数对称反映了资源获取/释

SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?

原文:SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?   本文出处:http://www.cnblogs.com/wy123/p/6704619.html      问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时候一个一个显式地删除过程中定义的临时表(drop table #tName),有些人又没有这个习惯,对于不明真相的群众或者喜欢思考的人会问,存储过程中定义的临

显式锁(第十三章)

显式锁 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:ReentrantLock.ReentrantLock并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能. 1. Lock接口与ReentrantLock Lock提供了一种无条件的.可轮询的.定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显示的. Lock接口: public interface Lock

oracle显式授权和隐式授权

oracle对象的授权 Oracle授权 一.授权语法 GRANT语法: 1.显式授权(直接将对象授权给用户) GRANT privilege [, ...] ON object [, ...]  TO  { Public| Group | Username|role} [WITH GRANT OPTION ] 例子grant read,write on directory dir_home to public 2.隐式授权(通过将角色授权给用户) GRANT role TO  { Public

《Android 应用案例开发大全(第二版)》——6.3节显式和隐式访问窗口

6.3 显式和隐式访问窗口 Android开发权威指南(第二版) 到现在为止读者已经见识过大量的Android应用程序,这些应用大多都有两个或两个以上的窗口,这就要求在某一个窗口中显示另外一个窗口.想必读者已经观察到不同显示窗口的方式.我们最开始接触到直接指定窗口类的方式称为显式访问窗口,而后来的一些程序,尤其是上一章调用系统窗口的例子又向我们展示了另外一种访问窗口的方式:隐式访问窗口. 显式访问窗口不会产生歧义,系统可以毫不犹豫地显示指定的窗口,下面是一段典型的显式访问窗口的代码. Inten

ado-请教ADO操作Access库重复用ADO对象的问题

问题描述 请教ADO操作Access库重复用ADO对象的问题 我写了一个CADO类,我在构造函数里初始化com组件,创建连接对象并实例化.在析构函数里清除com组件,并关闭连接对象.我还写个一个函数_Recoreset ExcuteSQL(CString str) 里面定义了一个记录集对象并且实例化,然后将参数转化成SQL 语句,打开记录集并且把记录集返回. CADO::CADO() { //初始化COM库 ::CoInitialize(NULL); try { //创建连接对象实例 m_pCo

详解在C++中显式默认设置的函数和已删除的函数的方法_C 语言

在 C++11 中,默认函数和已删除函数使你可以显式控制是否自动生成特殊成员函数.已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型提升,这会导致意外的函数调用. 显式默认设置的函数和已删除函数的好处 在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数.复制构造函数.复制赋值运算符和析构函数.这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构.也就是说,可以创

python 参数列表中的self 显式不等于冗余_python

self在区分全局变量/函数和对象中的成员变量/函数十分有用.例如,它提供了一种作用域机制,我个人认为比Ruby的@和@@清晰多了,这可能是习惯使然吧,但它确实和C++.Java中的this很相似. 然而,self总是有令我困扰的地方,我以前在这里说过-我曾幻想能在Python3中这些能得以改进,然后通常会引发一轮热议并最终以人们所说的"显胜于隐"告终. 我在巴西的时候曾和Luciano Ramalho(巴西Python组织的主席)有过一次交谈.他让我明白并非无处不在的self让我困扰