我创建了一个预计运行数天(甚至数周(的Symfony 3
命令。它使用Doctrine 2
读取一些初始数据,并不时写入执行状态。SQL 预计需要几毫秒。
我担心的是,如果MySQL连接由于不活动而关闭,整个过程最终会崩溃。
问题:Doctrine 是否在flush
调用之间保持数据库连接打开?或者,每次调用flush
时都会重新连接吗?
AFAIK Symfony将在您的应用程序中首次使用Doctrine时打开与数据库的连接,并在发送HTTP请求时关闭它(或者如果您明确告诉Doctrine关闭它(。连接后,Doctrine 将使连接处于活动状态,直到您明确关闭它(并且在flush()
之前、期间和之后将处于活动状态(
在您的情况下,您可能应该在需要时显式打开和关闭数据库连接。类似于以下代码的内容可以解决您的问题:
// When you need the DB
/**
* @var DoctrineDBALConnection $connection
*/
$connection = $this->get('doctrine')->getConnection();
// check if the connection is still active and if not connect to the db
if(!$connection->isConnected()) {
$connection->connect();
}
// Your code to update the database goes after this.
your code
// Once you're done with the db update - close the connection.
if($connection->isConnected()) {
$connection->close(); // close the db connection;
}
这将避免数据库连接超时等,但是如果此脚本运行的时间与您所说的一样长,您应该非常小心内存泄漏。使用Symfony可能不是解决这个问题的最佳方法。
您只需每 1000 秒 ping 一次连接,小于 MySQL 的连接限制。
最好的办法是运行一个监督进程(例如,受监督(,一旦你的应用停止,它就会重新启动这个过程。然后,您可以简单地告诉您的脚本在断开连接之前退出(因为它是一个配置的值,例如在MySQL中它是wait_timeout
变量(。监督过程会注意到你的应用已死,并重新启动它。