AnyEvent::DBI и переподключение к базе данных

Я использую AnyEvent::DBI в одноэлементном пакете, и когда через много часов в базе данных/запросах и т. д. нет активности, я получаю эту ошибку при попытке выполнить запрос:

DBD::mysql::st execute failed: MySQL server has gone away at /usr/local/share/perl/5.10.1/AnyEvent/DBI.pm line 98.

Простой подход: подключиться к БД ==> Выдать запрос ==> Закрыть соединение. это то, что я обычно использую, когда работаю с DBI.

Проблема в моем случае заключается в том, что я не могу найти способ повторно подключиться к базе данных с помощью AnyEvent::DBI, кроме как создать новый экземпляр AnyEvent::DBI (новый).

Любые предложения были бы замечательными!


person snoofkin    schedule 07.10.2011    source источник


Ответы (2)


Согласно документации DBD::mysql на CPAN, вы хотите использовать:

$dbh->{mysql_auto_reconnect} = 1;

Вот ссылка на референс:

http://metacpan.org/pod/DBD::mysql

person Jeffrey Ray    schedule 05.12.2012

В MySQL есть переменная wait_timeout, которая устанавливает продолжительность неинтерактивных подключений.

Для длительных соединений вы можете попробовать изменить это значение (по умолчанию = 28800) на более подходящее.

wait_timeout значение можно обновить с помощью простого запроса

mysql> SET SESSION wait_timeout = 50000;

и извлечено с другим

mysql> SHOW VARIABLES LIKE 'wait_timeout';
person Marco De Lellis    schedule 07.10.2011
comment
Поскольку я понятия не имею, сколько времени БД будет находиться в неактивном состоянии, я не могу точно знать, сколько секунд нужно установить wait_timeout, поэтому я думаю, что подключение и повторное подключение к БД — лучшее решение? - person snoofkin; 07.10.2011
comment
@soulSurfer2010 Соединение с БД стоит дорого; вы уже пытались обернуть код execute() внутри блока eval {}, (с опцией RaiseError => 1)? Проверка $@ после execute() может дать возможность переподключиться. - person Marco De Lellis; 07.10.2011
comment
Проблема в том, что я не знаю, как переподключиться в AnyEvent::DBI. Если бы я использовал DBI напрямую, я, вероятно, уже понял бы, что это далеко. - person snoofkin; 07.10.2011
comment
Вам нужно настроить обработку ошибок, используя обратный вызов конструкции on_error для обработки ошибок отключения базы данных. Просто повторно подключитесь и воссоздайте свой дескриптор. Вы можете обойти это, генерируя таймер для SELECT 1 для базы данных каждый раз, когда он поддерживает активность, но другой путь также будет обрабатывать повторное подключение в случае перезапуска сервера sql, проблем с сетью и т. д. - person Oesor; 07.10.2011
comment
@MarcoDeLellis с подключениями к базе данных MySQL действительно дешевы. Это не похоже на Oracle и MS SQL, где они дороги. - person mpeters; 07.10.2011
comment
@Oesor проблема с on_error заключается в том, что мне нужно будет использовать «новый» для создания нового экземпляра AnyEvent::DBI, пакет является одноэлементным, и он уничтожит первый экземпляр, мне нужен способ повторного подключения, используя уже доступный пример - person snoofkin; 13.10.2011