2

如何使 MySQL 数据库在使用 PHP Interactive Shell 期间始终可用?

我有一个问题,我一开始就连接到数据库,很快就超时了。系统管理员将 MySQL 数据库的超时设置为 10 秒(空闲),我无法更改该值。然而,这个值不足以及时与带有外壳的 Propel 对象交互。我在不改变 MySQL 服务器配置的情况下寻找方法。

例如

// Assume that User is the Propel class
$con = User::create();
$first = $con->findPk(2); // Still alive
sleep(11);
$second = $con->findPk(1); // Dead -- Return NULL

MySQL 变量的详细信息(请注意,我不允许更改这些变量)

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 360   |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 28800 |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 28800 |
+----------------------------+-------+
4

1 回答 1

0

如果你真的不能在数据库端解决这个问题,那么有解决方法。遗憾的是,我不知道如何用 Propel2 制作它(我用 Doctrine2 做了类似的事情),但也许有人会建议它。

这个想法是创建 Propel 将使用的连接类而不是默认的连接类。在这个类中,您必须确保连接在每个查询中仍然存在,如果不是 - 创建新连接(所有这些都应该静默进行)。

这看起来像这样:

class Connection
{
    // ...
    public function query($stmt)
    {
        $result = $this->pdo->query($stmt);
        if (!$result) {
            $this->reconnect();
            $result = $this->pdo->query($stmt);
        }
        return $result;
    }
    // ...
}

PS再次 - 如果你可以在数据库端解决它,你不应该这样做

于 2012-11-09T09:05:11.077 回答