要想正确回答这个问题,需要在两个不同情况下检验测试结果:第一是每页执行一个数据库处理的情况,第二是每页执行多个数据库处理的情况。
在前面的例子中,我们已经创建了一个单独的Connection对象,并将它传递到记录集的ActiveConnection 属性。但是也有可能仅仅把连接字符串传递到这个属性中,从而可以避免一个额外的步骤,即在脚本( ADO__03.asp )中例示和配置一个单独的组件:
objRS.ActiveConnection = Application("Conn")
因此,我们的第二个规则是:
* 当使用一个单个记录集时,将连接字符串传递到ActiveConnection属性中。
下面要确定当在一个页面上创建多个记录集时,这个逻辑是否依然成立。为测试这个情况,我引入了FOR 循环,将前面的例子重复10次。在这个测试中,我们还将研究3种选择:
第一,我们在每个循环中创建并销毁Connection 对象( ADO__04.asp ):
Dim i
For i = 1 to 10
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open Application("Conn")
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.ActiveConnection = objConn
objRS.CursorType = 0 'adOpenForwardOnly
objRS.LockType = 1 'adLockReadonly
objRS.Open Application("sql")
If objRS.EOF Then
Response.Write("No Records Found")
Else
'write headings
...
'write data
...
End If
objRS.Close
Set objRS = nothing
objConn.Close
Set objConn = nothing
Next
第二,在循环外创建一个单独的Connection 对象,并与每个记录集共享它( ADO__05.asp ):
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open Application("Conn")
Dim i
For i = 1 to 10
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.ActiveConnection = objConn
objRS.CursorType = 0 'adOpenForwardOnly
objRS.LockType = 1 'adLockReadonly
objRS.Open Application("sql")
If objRS.EOF Then
Response.Write("No Records Found")
Else
'write headings
...
'write data
...
End If
objRS.Close
Set objRS = nothing
Next
objConn.Close
Set objConn = nothing
第三,在每个循环中将连接字符串传递到ActiveConnection 属性( ADO__06.asp ):
Dim i
For i = 1 to 10
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.ActiveConnection = Application("Conn")
objRS.CursorType = 0 'adOpenForwardOnly
objRS.LockType = 1 'adLockReadonly
objRS.Open Application("sql")
If objRS.EOF Then
Response.Write("No Records Found")
Else
'write headings
...
'write data
...
End If
objRS.Close
Set objRS = nothing
Next
尽管如此,我们的第3条规则是:
* 在一个页面上使用多个记录集时,创建一个Connection 对象,在ActiveConnection 属性中重复使用它。
指针和锁的类型中,哪些是最有效的?
到目前为止,我们所有测试都只用了只向前(Forward Only )的指针在记录集中循环。但是,ADO还为记录集提供了3种类型的指针:Static(静态),Dynamic(动态)和 Keyset(键盘)。每一种都提供了额外的功能,比如向前和向后移动以及当别人建立数据时可以看到修改情况的功能。不过,讨论这些指针类型的内涵不是本文讨论的范围。我把这些留给你自己。下面是各种类型的比较分析。
从本质上说,同样的问题也适用于锁的类型。前面的测试中只使用了Read Only(只读)类型的锁。但是,还有三种类型的锁:Lock @R_110_3270@、 Lock Optimistic和Lock Batch Optimistic。同指针的选择一样,这些锁也为处理记录集中的数据提供了额外的功能和控制。同样,我将学习每种锁设置的适当用途的内容留给你自己。
获取一个记录集最好的方式是什么?
到目前为止,我们只是通过Recordset 对象来恢复记录集。但是ADO还提供了一些获取记录集的间接方法。下一个测试就将ADO__03.asp 中的值与直接从一个Connection对象中创建一个记录集对象( CONN_01.asp )来比较。
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open Application("Conn")
Set objRS = objConn.Execute(Application("sql"))
然后,我们看看从一个Command 对象中直接创建一个Recordset 对象( CMD__01.asp ):
Set objCmd = Server.CreateObject("ADODB.Command")
objCmd.ActiveConnection = Application("Conn")
objCmd.CommandText = Application("sql")
Set objRS = objCmd.Execute
通过Recordset 类创建一个记录集对于控制如何处理记录集提供了最大的灵活性。虽然其它方法也没有提出一个压倒性的性能问题,但是你会被默认状态下返回何种指针类型和锁类型而困惑,这些对于你的特定需求来说不一定是最优的。
所以,除非因为某种特殊原因你需要其它方法的话,请遵循第5条规则:通过ADODB.Recordset 类例示记录集以获得最好的性能和最大的灵活性。
是否应该断开记录集?
ADO为断开一个记录集提供了一种选择,记录集要在一个向前查询中恢复所有数据、关闭连接、使用一个本地(或客户)指针在数据集中移动。这还提供了一个早期释放连接的机会。这种情况对于处理远程数据服务是必要的,因为这种情况下数据必须从数据库断开。但是对于普通的用途,这样做有好处吗?
下面我们增加了CursorLocation 属性,打开记录集后关闭连接( CLIENT1.asp ):
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.CursorLocation = 3 ' adUseClIEnt
objRS.ActiveConnection = Application("Conn")
objRS.LockType = 1 ' adLockReadonly
objRS.Open Application("sql")
objRS.ActiveConnection = nothing
规则6是这样的:除非是一个断开的环境中所要求的,避免使用断开的记录集。
什么是设置记录集属性的最好方法?
前面所有的测试都是通过单独的属性设置来直接设置记录集的属性的。但是Recordset.Open 函数可以为我们所需要的全部属性接收额外的参数。虽然对于每个属性来说,单独的代码行易于阅读和维护,它们还是要分别执行一个单独函数调用,必须通过COM界面来集合( ADO__07.asp ):
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open Application("sql"),Application("Conn"),1
' adForwardOnly,adLockReadonly
以上是内存溢出为你收集整理的什么才是提高ASP性能的最佳选择(续二)全部内容,希望文章能够帮你解决什么才是提高ASP性能的最佳选择(续二)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)