Perl: DBI & MySQL — авто реконнект (reconnect)

Если вы программист на Perl и работаете с MySQL, то вот вам совет, как обеспечить коннект к серверу, и в тоже время, обеспечить себе легкую жизнь. Ведь если истечёт таймаут при работе с сервером, $dbh (database handle) будет не актуальным и выдаст ошибку. Особенно это актуально тогда, когда ваша программа работает с MySQL, и в то же время выполняет другие длительные операции, время которых может превысить таймаут-значение (connect timeout) MySQL. В такой ситуации ваш handle будет не актуальным.

Решение есть. Но в то же время есть ещё одна тонкость. DBB::mysql драйвер имеет опцию автореконнекта (mysql_auto_reconnect) и будет следить за актальностью handle и при случае переконнектится. Но вот что делать с коммандами, которые иногда надо выполнить сразу после коннекта, например SET NAMES ‘utf8’;SET CHARACTER SET ‘utf8’ ? И тут есть решение! Хотя найти его не всегда легко в интернет 🙂

Вообщем, вот код для коннекта из под Perl к MySQL так, чтобы всё работало пучком:

$dbh = DBI->connect( "dbi:mysql:database=database_name;mysql_client_found_rows=1;mysql_enable_utf8=1;mysql_socket=/socket_of_mysql", 'user', 'password',
    {
	RaiseError		=> 1,
	AutoCommit		=> 1,
	mysql_multi_statements	=> 1,
	mysql_init_command	=> q{SET NAMES 'utf8';SET CHARACTER SET 'utf8'}
    } ) or die "Cannot connect";
$dbh->{mysql_auto_reconnect} = 1;

Код проверен мною и тщательно протестирован

Perl: DBI & MySQL — авто реконнект (reconnect): 2 комментария

  1. Почему может истечь «таймаут при работе с сервером» MySQL?
    Есть ли значение по умолчанию, можно ли его изменить и как? Таймаут возникает по инициативе сервера или клиента?

  2. Как побороть первый ваш вопрос — рассказывает именно это статья. Не понял, зачем вы его задавали.
    По умолчанию есть — посмотрите, пожалуйста, документацию опций запуска MySQL или список его настроечных переменных. Там есть точно.
    Конечно, таймаут возникает по инициативе сервера. Ведь именно он контролирует ресурсы (таблицы, коннекты) и страдает от их недостатка.

Обсуждение закрыто.