|
蓝森林 http://www.lslnet.com 2006年8月25日 8:28
[ASP]关于记录集和其它-------精华贴里的一些疑问
recordset读取记录一次读取多少条,是都读到内存里吗?
-----------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------
引用:asp3.0高级编程
高速缓存的大小是指ADO每次从数据存储中读取的记录的数量,缺省为1。这意味着当使用基于服务器的光标时,每当移动到另一条记录时,必
须从数据存储中提取记录。举一个例子,如果增大高速缓存的大小为10,那么每次读入ADO缓冲区的记录数将变为10。如果访问位于高速缓存内
的记录,那么ADO不需要从数据存储中取记录。当访问位于高速缓存外的记录时则下一批记录将读入到高速缓存中。
通过使用记录集的CacheSize属性,可以设置高速缓存的大小。
rs.cachesize = 10
可以在记录集生命期的任何时候改变高速缓存的大小,但新的数量只在提取下一批记录后才有效。
与许多改进性能的技巧类似,高速缓存没有通用的最佳大小,因为它随任务、数据和提供者的不同而改变。但是,从1开始增加高速缓存的大小
总是能提高性能。
如果你想看到这一点,可以使用SQL Server Profiler并查看使用缺省的高速缓存打开一个记录集发生的情况,并比较增大高速缓存后发生的情
况。增大高速缓存的大小不仅减低了ADO的工作量,同时也降低了SQL Server的工作量。
-----------------------------------------------------------------------------------------------------------------------------
从上面资料推断,记录集每次只读取一条记录。那么在使用recordcount、pagecount属性时还是只读取一条记录吗?还是说遍历了整个记录集
才取到这两个属性?
-----------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------
引用:http://bbs.blueidea.com/viewthread.php?tid=407293
另外,不要在Recordset Open方法中使用ConnectionString,而是以独立的方式打开Connection对象;这样,当我们要关闭Connection对象以
及要把它设置成Nothing的时候,引用它就很方便了。
-----------------------------------------------------------------------------------------------------------------------------
我自己做了个实验:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!--#include file="Connections/con_law1.asp" -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body>
<%
dim rs,conn
set conn = Server.CreateObject("adodb.connection")
set rs = Server.CreateObject("adodb.recordset")
conn.open MM_con_law_STRING
rs.open "select * from news_fffff",MM_con_law_STRING,1,1,1
while not rs.eof
response.Write(rs("title")&"<br />")
rs.movenext
wend
conn.close
set conn = nothing
rs.movefirst
response.Write(rs("title"))
rs.close
set rs = nothing
%>
</body>
</html>
-----------------------------------------------------------------------------------------------------------------------------
如果隐式的创建连接,那么连接关闭后是不是就不会保存在连接池中,无法再次利用?
从上面资料看,连接中断后仍然可以操作recordset对象,那么是不是意味着记录集只在创建的时候需要连接,创建以后再次使用就不需要连接
了;还是说再次使用记录集时还是会从连接池中调用以前的那个connection对象?
假如再次使用需要连接,那么在记录集关闭之前关闭连接是不明智的吧。
假如再次使用不需要连接,那么是不是说明记录集在打开时已经把全部数据读到内存了?
用户较多时,用ADO分页是不是效果不好?为什么,尤其是解释一下记录集怎么读取数据的?
对于ADO的这个工作方式很头疼,各位有没有一些资料可以分享的,非非常常感谢?请达人指点一下我的这些疑问? |
ASP都用RecordSet操作数据,RecordSet的数据是由connection返回给它的。
Set oRS = Server.CreateObject("ADODB.Recordset")
oRS.CursorLocation = adUseClient'这是离线操作的关键
这样就可以离线操作RecordSet数据,只要在编辑数据时,才连接数据库。
分页中最耗资源的是RecordSet.recordCount,因为是它是遍历整个记录集,当数据量大时消耗的时间可以明显感觉出来的。
关于默认的cachesize是多少条记录,你可以用Response.Write出来看看不就清楚了 |
cjj在上个帖子中说
非常感谢回贴!!!!使我又对这个问题理解更深了些,写点我的认识。
--------------------------------------
1、首先来讨论一下使用客户端光标时的情况,使用客户端光标只在编辑数据库时才连接到数据库。那么由此判断recordset一次性把所有数据都读到了内存中,那么这对大的记录集是不适用的。
2、如果使用服务器端游标,可以肯定的是cachesize默认是1,每次只读取一条记录。当使用recordcount等属性时需要遍历记录集,所以最好只读取一次将值赋给一个变量。
3、使用服务器端游标,由于cachesize默认是1,所以每次移动记录集光标时都需要连接,在记录集关闭之前就关闭连接是不明智的。但是cachesize如果设置成每页显示的记录数,比如每页要显示20个记录,就把cachesize设置成20,这时就应该在取到记录集之后立即关闭连接,以节约服务器资源。
4、隐式的创建连接是无法在连接缓存池中再次利用的。
|
|