经典ASP - 使用一个连接进行多次查询?

时间:2009-11-18 12:50:16

标签: sql-server asp-classic connection-pooling

考虑在IIS6上运行的经典ASP站点,该站点具有专用的SQL Server 2008后端......

场景1:

打开连接
通过ASP页面进行15次查询,更新等 关闭连接

场景2:

对于每个查询,更新等,打开并关闭连接


通过连接池,我的资金将在方案2中最有效和可扩展。

我的假设是否正确?

编辑:更多信息

这是数据库操作分布在单独的函数中的许多asp代码,执行单独的事情等。它不是快速连续执行的15个查询。想想一个有很多功能的大型网站,包括等等。

6 个答案:

答案 0 :(得分:3)

从根本上说,ASP页面是同步的。那么为什么不在每页加载时打开一次连接,并在每页加载时关闭一次?所有其他打开/关闭似乎都是不必要的。

答案 1 :(得分:2)

在您的场景2中,您的应用程序和SQLServer之间会进行往返,以执行每个查询,从而消耗服务器的资源,并且总执行时间将会增加。
但在场景1中,只有一次往返,SQLServer也会在一次运行所有查询。所以它更快,耗费更少资源

编辑:好吧,我认为你的意思是一次性多次查询 因此,启用连接池后,每次事务后关闭连接都没有问题。所以请使用场景2

答案 2 :(得分:2)

最佳做法是打开连接一次,读取所有数据并尽快关闭连接。关闭连接后,您可以使用检索到的数据执行所需操作。在这种情况下,您不会打开太多连接,也不会打开连接太长时间。

即使你的代码在几个地方都有数据库调用,创建连接的开销会比等待更糟糕 - 除非你说你的页面需要花费很多秒才能在服务器端创建?通常,即使没有受控数据访问和许多功能,您的页面也应该在一秒钟内在服务器上生成。

答案 3 :(得分:2)

如果我理解正确的话,你正在考虑在各种包含的各种功能中的复杂代码中共享连接对象。

在这种情况下,这将是一个坏主意。如果其他代码可能已经看到需要修改它们,则很难保证连接上的正确状态和设置。此外,您有时可能会获取获取firehose记录集的代码,并且在调用另一段也需要连接的代码时尚未完成处理。在这种情况下,您无法共享连接。

让每个原子代码块获得自己的连接会更好。连接将处于干净的已知状态。必要时,多个连接可以并行运行。正如其他人所指出的那样,连接创建的成本几乎完全被底层连接池所缓解。

答案 4 :(得分:0)

我认为默认连接池大约有20个连接,但SQLServer可以处理更多。从服务器获取连接需要花费最长的时间(假设您没有对命令执行任何操作),因此我认为每页获取连接并在以后使用时将其终止。

对于可扩展性,当您的数据库在那里有100个备用连接但没有人使用它们时,您的脚本会等待连接可用时,您可能会遇到连接池过于繁忙和超时的问题。

在同一页面上创建并杀死我的投票。

答案 5 :(得分:0)

从性能的角度来看,没有明显的区别。 ADODB连接池管理与db的实际连接。 Adodb.connection .open和.close只是连接池的一个外观。实例化1或15个adodb.connection对象在性能方面并不重要。在我们使用事务之前,我们将连接字符串与adodb.command(.activeConnection)结合使用,并且从不显式打开或关闭连接。

明确保持对adodb.connection的引用的原因是事务或基于连接的函数,如mysql last_inserted_id()。在这些情况下,您必须绝对确定每个查询都获得相同的连接。