【问题标题】:Parallel MySQL connections closes temporary table并行 MySQL 连接关闭临时表
【发布时间】:2012-09-21 18:03:45
【问题描述】:

我在社区中偶然发现了我的问题,但我找不到解决方案 - 也许它是特定的。我在 PHP 中执行的以下函数/操作序列:

  1. 构造一个 class_1 的对象
  2. class_1 中的函数在没有定义链接标识符的情况下连接到 MySQL
  3. 然后我创建一个临时表 [..class_1 中的函数做某事..]
  4. 调用了一个新函数,该函数创建了 class_2 的 object_2
  5. 在 object_2 中我创建了一个新的 MySQL 连接,参数为创建新链接 true 和链接标识符
  6. 我使用链接标识符在 object_2 中关闭 MySQL_close 的 MySQL 连接
  7. 在 object_1 中临时表仍然不存在/它尝试自动重新连接到 MySQL

如果我不创建 object_2 一切正常。我做错了什么?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    如何解决您的问题:在class_1 中也添加一个链接标识符,否则 mysql 库将采用最后一个(您已关闭)。

    【讨论】:

    • 你是对的。但是 class_1 的 mysql 连接被许多不同的类使用,比如插件。所以存储可能很复杂。如果它只关闭最后一个连接,它不应该对我在 class_1 中的临时表产生影响?
    • 但是由于你没有共享第一个连接的链接,所以在class_2中关闭后,class_1使用了错误的链接。见mysql_query
    【解决方案2】:

    这是按预期工作的。 From the MySQL documentation:

    "临时表

    您可以在创建表时使用 TEMPORARY 关键字。 TEMPORARY 表仅对当前连接可见,并在连接关闭时自动删除。这意味着两个不同的连接可以使用相同的临时表名,而不会相互冲突或与现有的同名非临时表冲突。 (在删除临时表之前,将隐藏现有表。)"

    为避免这种情况发生,请不要明确关闭连接。来自mysql_close() 的 PHP 文档:

    “通常不需要使用mysql_close(),因为非持久打开的链接会在脚本执行结束时自动关闭。另见freeing resources。”

    相反,您应该将mysql_connect()返回的连接资源存储在局部变量中,以便PHP的垃圾收集器可以在对它的所有引用超出范围时自动关闭连接。

    【讨论】:

      【解决方案3】:

      感谢大家帮助寻找解决方案。如前所述,链接标识符解决方案对我来说有点糟糕。 php.net 详细描述了我的问题以及如何解决的一些提示:

      以下是共享链接的工作原理: - 每个链接都是一个资源。 mysql_connect() 默认查找具有相同参数的资源。如果存在,它将返回 现有资源。 - 每次将该资源分配给变量都会增加资源的引用计数。 - 当引用减为零时,底层 TCP/socket 连接关闭。 - 每次分配远离该资源的变量都会减少引用计数。 (这包括功能级别 变量超出范围) - mysql_close() 也会减少引用计数。

      注意最后两点:mysql_close() 重新分配一个 变量减少链接的引用计数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-27
        • 2010-11-21
        • 2020-05-29
        • 2019-12-28
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        相关资源
        最近更新 更多