Как закрыть соединение Doctrine в Symfony 1.4 - PullRequest
0 голосов
/ 07 декабря 2018

Я использую Symfony 1.4 для своего веб-приложения, которое использует doctrine 1.2 для подключения к моей базе данных MySQL.У меня есть задача Symfony, которая сначала выбирает некоторые данные, используя запросы доктрины, а затем выполняет очень трудоемкую операцию, не связанную с базой данных (например, бесконечный цикл for), которая не требует подключения к базе данных.Поскольку последняя операция не требует подключения к базе данных, чтобы открыть, мне нужно закрыть подключение к базе данных после выполнения операций с базой данных.Поэтому я попытался с помощью следующего кода закрыть соединение с базой данных.

sfContext::createInstance($configuration);
sfContext::getInstance()->getDatabaseConnection('doctrine')->setAttribute(Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true );

// Do the doctrine queries and fetch data

sfContext::getInstance()->getDatabaseManager()->shutdown();
gc_collect_cycles();

// Do the non-database operation

Пока выполняется операция, не связанная с базой данных, я проверил активные процессы mysql с помощью команды SHOW PROCESSLIST, работающей на MySQL.Он по-прежнему показывает, что соединение MySQL, созданное приложением Symfony, не закрыто, а находится в состоянии сна.

Есть ли способ окончательно закрыть соединение с базой данных в Symfony.

Примечание. Я обнаружил, что соединение доктрины закрывается, если соединение закрывается до выполнения запросов доктрины.

Это, скорее всего, потому, что Doctrine использует PDO, а PDO необходимосбросьте все ссылки перед закрытием соединения MySQL, иначе соединение будет активным.Но я не знаю, как очистить ссылки на PDO в Doctrine.

1 Ответ

0 голосов
/ 07 декабря 2018

Это действительно старый материал, с которым вы работаете.Я не уверен, почему вы получаете вещи из синглтона sfContext.Вместо этого вы должны сделать это:

$conn = Doctrine_Manager::connection();
$conn->close();

Это должно закрыть соединение, но оставить его зарегистрированным в диспетчере соединений.Это в основном прямо из Doctrine1 руководства .

Это позволит вам перебирать соединения и закрывать их, одновременно удаляя их из менеджера:

$manager = Doctrine_Manager::getInstance();
foreach($manager as $conn) {
    $manager->closeConnection($conn);
}
...