9

У меня есть задача командной строки Symfony, которая имеет привычку отбрасывать соединение mysql.Обновить соединение с базой данных, если соединение падает или истекает

Его задача импорта данных. Которая извлекает данные из нескольких соединений. Это не один большой запрос, а несколько меньших.

Кажется, что соединение с ним в первый раз прекращается. Примерно на полпути через скрипт. Однако во второй раз его запуск (с самого начала) всегда завершает задачу.

Его отсутствие времени на запрос в качестве ответа об ошибке, которое я получаю, это то, что соединение было удалено и оно работает нормально самостоятельно. Таким образом, я думаю, что его некоторая проблема с тайм-аутом, которую избегают, когда она выполнялась во второй раз из-за кеширования запросов, ускоряющего сценарий.

Итак, мой вопрос в том, как обновить соединение с базой данных?

[Doctrine\DBAL\DBALException]
SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query

+0

Можете ли вы показать нам запросы? Вы используете доктрину? Сколько строк мы говорим (импорт)? –

+0

Имеет ли журнал MySQL какие-либо записи после неудачной попытки? – likeitlikeit

ответ

8

Возможно, вы хотите подключиться к базе данных, если по какой-либо причине соединение потеряно. Учитывая EntityManager, вы можете сделать это следующим образом:

$success = $_em->getConnection()->connect(); 

С getConnection, вы извлекаете объект соединения доктрины использования (Doctrine\DBAL\Connection), который предоставляет метод connect.

В любое время вы можете позвонить connect, так как он проверяет, установлено ли соединение. Если это так, он возвращает false.

Существует также метод isConnected, чтобы проверить, установлено ли соединение. Вы можете использовать это, чтобы увидеть, где именно происходит соединение, чтобы получить более четкое представление о том, что происходит.

+1

Не работает. Когда соединение потеряло сущность менеджера вещи, которые он уже подключил, не вызывает для этого ни одного слушателя. Рабочее решение: http://stackoverflow.com/questions/15362070/zf2-doctrine2-server-has-gone-away-how-to-jog-an-old-connection –

6

Другой подход заключается в проверке того, что доктрина все еще подключена к серверу mysql с помощью метода ping() в соединении. Если соединение потеряно, закройте активное соединение, так как оно еще не закрыто и запустит новый.

if(FALSE == $em->getConnection()->ping()){ 
    $em->getConnection()->close(); 
    $em->getConnection()->connect(); 
} 
+0

Правильный ответ! – Sliq

Смежные вопросы