object – 经典ASP – 何时关闭记录集
我想知道,以下哪个示例最适合在我的情况下关闭记录集对象?
1) 这个关闭循环内的对象,但在下一个移动时打开一个新对象.如果有1000条记录,则会打开一个对象1000次并关闭1000次.这就是我通常会做的事情: SQL = " ... " Set rs1 = conn.Execute(SQL) While NOT rs1.EOF SQL = " ... " Set rs2 = conn.Execute(SQL) If NOT rs2.EOF Then Response.Write ( ... ) End If rs2.Close : set rs2 = Nothing rs1.MoveNext Wend rs1.Close : Set rs1 = Nothing 2) 这个例子就是我想知道的.在循环结束之后保存对象闭包(rs2.close),是获得还是降低性能?如果有1000条记录,这将打开1000个对象但只关闭一次: SQL = " ... " Set rs1 = conn.Execute(SQL) While NOT rs1.EOF SQL = " ... " Set rs2 = conn.Execute(SQL) If NOT rs2.EOF Then Response.Write ( ... ) End If rs1.MoveNext Wend rs1.Close : Set rs1 = Nothing rs2.Close : set rs2 = Nothing 我希望我已经很好地解释了自己,并不是太愚蠢. UPDATE 对于那些认为可以修改我的查询以避免N 1问题(第二次查询)的人,这里是: 这是一个在线图片库.我有两张桌子; “photoSearch”和“照片”.第一个“photoSearch”只有几列,包含照片的所有可搜索数据,例如“photoID”,“标题”,“人物”,“dateCaptured”和“关键字”.它有一个多列全文索引(标题,标题,人物,关键字).第二张表“照片”包含所有照片数据;高度,宽度,版权,ID,日期等等.两者都有500K行,标题和标题字段有时返回2000个字符. 这大约是查询现在的样子: SQL = "SELECT photoID FROM photoSearch WHERE MATCH (headline,caption,people,keywords) AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE) AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"' LIMIT 0,50;" Set rs1 = conn.Execute(SQL) While NOT rs1.EOF SQL = "SELECT photoID,setID,eventID,locationID,headline,instructions,dateCaptured,dateUploaded,status,uploaderID,thumbH,thumbW,previewH,previewW,+ more FROM photos LEFT JOIN events AS e USING (eventID) LEFT JOIN location AS l USING (locationID) WHERE photoID = "&rs1.Fields("photoID")&";" Set rs2 = conn.Execute(SQL) If NOT rs2.EOF Then Response.Write ( .. photo data .. ) End If rs2.Close rs1.MoveNext Wend rs1.Close 经过测试,在自己的桌子上有全文索引,“photoSearch”,而不是大表,“照片”,似乎有点提高速度.我没有添加“photoSearch”表,它已经存在 – 这不是我的应用程序.如果我尝试加入这两个表以丢失第二个查询,我会丢失所有索引,导致很长时间 – 所以我不能使用全文连接.这似乎是最快捷的方法.如果不是全文和加入问题,我会将这两个问题结合起来. 解决方法
这就是事情.首先,获取你的照片ID并使mysql认为这是一个只保存照片ID的实际表格,然后制作你的实际声明,不需要任何额外的记录集连接……
并且不要忘记从最后开始做到这一点.以下是带有解释的示例代码: 步骤1创建照片ID查找表并命名:这将是我们的PhotoId查找表,因此将其命名为“PhotoIds” SELECT photoID FROM photoSearch WHERE MATCH (headline,50) AS PhotoIds 第2步现在我们有了照片ID,所以从中获取信息.我们将在WHERE子句之前插入上面的语句,就像我们使用真实表一样.请注意,我们的“假”表必须介于parantheses之间. SQL = "SELECT p.photoID,p.setID,p.eventID,p.locationID,p.headline,p.caption,+ more FROM photos AS p,events AS e USING (p.eventID),location AS l USING (p.locationID),(SELECT photoID FROM photoSearch WHERE MATCH (headline,keywords) AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE) AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"' LIMIT 0,50) AS PhotoIds WHERE p.photoID=PhotoIds.photoID;" 注意:我只是在这里编写这些代码而从未测试过.可能存在一些拼写错误或smt.如果您遇到麻烦,请告诉我. 现在得到你的主要问题 无需关闭执行的查询,尤其是在使用execute方法时.执行方法在执行后自行关闭,除非它没有返回任何记录集数据(这就是首先执行命令的目的),如:“INSERT”,“DELETE”,“UPDATE”.如果你没有打开记录集对象,那么为什么要尝试关闭从未打开的东西?相反,您可以使用Set Rs = Nothing来取消引用对象并发送到垃圾收集以释放一些系统资源(这与mysql本身无关).如果使用“SELECT”查询(将返回某些数据的查询),则必须打开记录集对象(ADODB.Recordset),如果打开它,则需要在完成其作业后立即将其关闭. 最重要的是在每次加载页面后关闭“与mysql服务器的主连接”.因此,您可以考虑将连接关闭算法(不是记录集关闭)放到包含文件中,并将其插入到与数据库建立连接的每个页面的末尾.长谈:如果使用Open(),必须使用Close() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 缩小ASP.NET MVC中的Action Filter属性
- asp.net – BC30560:’ExtensionAttribute’在名称空间’S
- 在ASP.NET中,<%#Bind(“”)%>和<%#Eval(“”)%&am
- .net – 为什么IHostedService是异步的
- 使用CQRS的ASP.NET MVC应用程序的良好读取模型是什么?
- .net – vNext是完全“基于约定的编程”吗?
- 在ASP.NET MVC 3 Web应用程序项目之间共享视图
- asp.net-web-api – Swagger WebApi在构建时创建json
- asp.net-mvc – ASP.NET MVC中依赖于语言的路由
- asp.net-mvc – 实用程序方法可以在MVC剃刀中返回原始html
- asp.net-mvc – FineUploader无法POST
- asp.net – 我可以将ViewBag属性返回给Ajax成功回
- asp.net-mvc – TempData [“sth”]为bool
- 如何向ASP.NET Core 1.0 MVC项目添加项目引用
- 身份验证 – 禁止ASP.NET Core中的API URL重定向
- .net – DataAnnotations与IDataErrorInfo
- asp.Net MVC视图模型在帖子上是空的
- asp.net-mvc – Asp.Net MVC中的管理区域
- 一步一步创建ASP.NET MVC5程序[Repository+Autof
- asp.net-mvc – DataAnnotations动态附加属性