【问题标题】:Connection is Busy with results for another hstmt ERRORConnection is Busy with results for another hstmt ERROR
【发布时间】:2011-01-19 13:29:55
【问题描述】:

我是新手。我用 PHP 编写了大部分查询。我创建了一个连接对象,然后点击了 sql server。

function navigation($sel_subject, $sel_page,$filter=false) {

    $subject_set = get_all_subjects();
    $page_set = get_pages_for_subject($subject["id"],$sec_wp,$filter);
}

function get_all_subjects() {
    global $connection;
    $query = "  SELECT * FROM subjects ORDER BY position ";
    return odbc_exec($connection,$query);
}

现在我正在更新一些只需要从数据库中获取数据的简单查询。我正在将它们升级到存储过程。

function get_all_subjects() {    global $connection;
    $query = "  EXEC get_all_subjects ";  
 return odbc_exec($connection,$query); }

我收到一条错误消息。 Connection is Busy with results for another hstmt ERROR

我正在使用 sql server 2005 和 ODBC 连接器。

解决此问题的最佳方法是什么。或者询问管理员是否可以更好的主意 做类似http://sourceitsoftware.blogspot.com/2008/06/connection-is-busy-with-results-for.html 奥塔尔霍尔斯塔德说…… 当使用 BDE 通过 ODBC 连接到 MS SQL Server 时,这可以(有时?)通过使用 SQL Native Client 而不是 SQL Server Driver for ODBC 来解决。

我想知道,最好激活 MARS(多个活动结果集)。如果是这样,请帮助我提供一个分步过程来启用它。

【问题讨论】:

    标签: php sql sql-server-2005 odbc connection


    【解决方案1】:

    您必须启用默认禁用的 MARS(多活动结果集)。您可以通过切换到“SQL Native Client”来避免此错误消息。欲了解更多信息check this

    【讨论】:

    • 链接失效了!
    【解决方案2】:

    当您完成odbc_exec 的结果后,您可以尝试添加odbc_free_result 调用吗?

    【讨论】:

    • 感谢您的回复。 odbc_free_result 清除 result_set。如果它是一个更新功能,那可能会解决问题。当我从中检索数据时……我需要调用我的第二个函数。我不能用这个:(
    【解决方案3】:

    我推荐其他框架,例如

    这些应该比odbc_更灵活和先进。 odbc_exec 致力于返回服务器端游标,它不允许在同一连接上运行另一个查询。客户端游标一次性将所有数据作为静态快照提供给客户端,因此该连接可免费用于其他查询。

    继续使用 odbc_,如果您在第一个结果集处于活动状态时需要另一个结果集,则可以创建多个连接句柄并使用不同的句柄。

    【讨论】:

      【解决方案4】:

      我想说一个潜在的解决方案分为三个部分。

      首先会更好地优化您的 SQL 语句。

      尝试使用 LIMIT 语句,不要使用 *,只定义您需要的字段。这两件事可以帮助减少 SQL 语句的内存负载。

      其次,尝试更好地优化您的数据库表结构(即:减少 Keyname/Index 值等。)如果您的数据库具有任何显着大小(例如,50,000 行或更大),可以尝试切换到 InnoDB 以防止出现行锁定。您还可以尝试从辅助(临时)数据库表中进行一些表复制和查询,以减少主数据库的负载。显然,在我们不知道您的数据库架构的情况下,这只是我“提出建议”。

      第三,除非您访问一个有 100 万行以上的数据库并且您遇到连接忙错误,否则您很有可能需要与您的托管服务提供商交谈。即使在共享服务器中,这些类型的错误消息(如果您的代码已尽可能优化)几乎总是由于您的服务器没有分配足够的内存。

      正如cyberkiwi 所指出的,您可以尝试将ADOdb 放入您的ftp 并通过它运行一个简单的循环,看看ADOdb 的内部内存分配是否有帮助。就像上传包含 ADOdb 的 ADOdb 并运行以下循环一样简单:

      $Data = $connection->Execute("SELECT field1, field2, field2 FROM subjects ORDER BY position ASC LIMIT 0, 10");
      if (is_object($Data)&&(!$Data->EOF))
      {
          while (!$Data->EOF)
          {
              //
              // string, array, echo, whatever here
              //
          $Data->MoveNext();
          }
      }
      unset($Data);
      

      最后,尽管这些类型的错误要么是由于编写不佳的 SQL 语句导致多个连接停止(在这种情况下要求增加“最大并发连接数”),要么只是不够板载内存或 php 分配的内存(在这种情况下要求增加“memory_limit”)。

      【讨论】:

      • 我在这里写的代码是示例代码。所以我写了 select * 而不是 select indivdual fields。测试时表中的记录数只有10。所以我怀疑我们是否还需要限制数量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-28
      • 2020-04-18
      • 2022-12-27
      • 2013-05-08
      • 1970-01-01
      • 2010-12-31
      • 2022-12-02
      相关资源
      最近更新 更多