代码之家  ›  专栏  ›  技术社区  ›  Kjensen

经典的ASP-对许多查询使用一个连接?

  •  4
  • Kjensen  · 技术社区  · 16 年前

    考虑一个在IIS6上运行的经典ASP站点,它有一个专用的SQL Server 2008后端…

    情景1:

    开放式连接
    在整个ASP页面中执行15个查询、更新等操作
    闭合连接

    情景2:

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


    对于连接池,我的钱将放在场景2中,这是最有效和可扩展的。

    我的假设是正确的吗?

    编辑:更多信息

    这是数据库操作,在不同的函数中分散在许多ASP代码上,执行不同的操作等。这不是15个快速连续的查询。想想一个有很多功能的大网站,包括等等。

    6 回复  |  直到 16 年前
        1
  •  2
  •   AnthonyWJones    16 年前

    如果我理解正确的话,您正在考虑在各种include中的各种函数中保存的复杂代码之间共享连接对象。

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

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

        2
  •  3
  •   Matthew Groves    16 年前

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

        3
  •  2
  •   mhmd    16 年前

    在场景2中,应用程序和sqlserver之间有一个往返行程,用于执行每一个消耗服务器资源和总执行时间的查询。
    但是在场景1中,只有一次往返,而且SQLServer将在一次内运行所有查询。因此,它更快、更少地消耗资源

    编辑: 嗯,我以为你是指一次查询多个问题……
    因此,在启用连接池的情况下,在每个事务之后关闭连接完全没有问题。因此,使用场景2

        4
  •  2
  •   Fenton    16 年前

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

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

        5
  •  0
  •   Pete Duncanson    16 年前

    我相信默认的连接池大约有20个连接,但是sqlserver可以处理更多的连接。从服务器获取连接花费的时间最长(假设您没有对命令做任何愚蠢的事情),所以我认为每一页获取一个连接并在随后使用时终止它没有任何错误。

    对于可伸缩性,您可能会遇到连接池太忙和超时的问题,而您的脚本等待连接可用,而您的数据库有100个备用连接,但没有人使用它们。

    在同一个页面上创建并杀掉我的选票。

        6
  •  0
  •   Joost Moesker    16 年前

    从性能的角度来看,没有显著的差异。ADODB连接池管理与数据库的实际连接。adodb.connection.open和.close只是连接池的一个立面。实例化1或15个adodb.connection对象实际上并不影响性能。在使用事务之前,我们将连接字符串与adodb.command(.activeconnection)结合使用,并且从不显式打开或关闭连接。

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