Если вы программист на 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;
Код проверен мною и тщательно протестирован
Почему может истечь «таймаут при работе с сервером» MySQL?
Есть ли значение по умолчанию, можно ли его изменить и как? Таймаут возникает по инициативе сервера или клиента?
Как побороть первый ваш вопрос — рассказывает именно это статья. Не понял, зачем вы его задавали.
По умолчанию есть — посмотрите, пожалуйста, документацию опций запуска MySQL или список его настроечных переменных. Там есть точно.
Конечно, таймаут возникает по инициативе сервера. Ведь именно он контролирует ресурсы (таблицы, коннекты) и страдает от их недостатка.