我目前正在尝试提高ASP Classic应用程序的性能,而且我正在改进SQL事务。
我一直在阅读http://www.somacon.com/p236.php
所以,我的问题是:
第set rs = conn.execute(sql)
行如何实际运作?
我相信该行定义了一个名为rs
的变量,并通过SQL语句(fx select * from users
)绑定从数据库收集的所有数据。
然后我实际上可以把数据库连接扔到地狱,如果我愿意,重新定义我的sql变量,这是真的吗?
如果这是真的,我会通过执行这样的代码来获得最佳性能:
set conn = server.createobject("adodb.connection")
dsn = "Provider = sqloledb; Data Source = XXX; Initial Catalog = XXX; User Id = XXX; Password = XXX"
conn.open dsn
sql = "select id, name from users"
set rs = conn.execute(sql)
conn.close
-- Do whatever i want with the variable rs
conn.open dsn
sql = "select id from logins"
set rs = conn.execute(sql)
conn.close
-- Do whatever i want with the variable rs
conn.open dsn
sql = "select id, headline from articles"
set rs = conn.execute(sql)
conn.close
-- Do whatever i want with the variable rs
set conn = nothing
在本例中,我每次执行sql事务时都会打开和关闭连接。
这是个好主意吗?
答案 0 :(得分:3)
这是个好主意吗?
不,但不是因为路加指出的原因。实际情况是ADODB无论如何都会缓存连接,因此打开和关闭连接并不是那么昂贵。然而,问题来自你似乎对记录集行为的错误信息......
你对Lukes的评论回答: -
但它是正确的,它在执行时将所有数据存储在变量中?
除非您仔细配置记录集返回为静态客户端游标,否则您必须确保光标已完全填充。只有这样才能断开记录集与连接的连接,并继续使用记录集中的数据。
默认情况下,SQL Server连接将提供一个简单的“fire-hose”行集(这实际上不是一个游标)数据是从查询原始传递的,只有少量缓冲发生在传入的记录中无法向后导航。
最小化连接所需时间的最有效方法是使用ADODB Recordset的GetRows
方法。这会将所有行吸收到二维变体数组中。获得此阵列后,您可以省去记录集和连接。
最大限度地减少服务器上维护的连接数量,但实际上在现代硬件上并不是大多数应用程序的真正问题。真正的问题是正在进行的查询维护数据库中的锁定的时间。通过快速使用和关闭记录集,可以最大限度地减少锁定时间。
但要谨慎。权衡是对Web服务器上内存的需求增加。你需要小心,不仅仅是将一个瓶颈转移到另一个瓶颈。那说你可以做很多事情。使用64位O / S并在其中填充大量内存或将Web服务器扩展到服务器场。
答案 1 :(得分:0)
不,打开和关闭连接成本很高。打开它,像你一样重用记录集,然后关闭它。