> наверное не "while (1) " а "while ($connect_db)"
> потом, если все таки "while (1)" (что вообще говоря порочно в данном
> случае)
> то первой строкой цикла должна быть проверка на $connect_db и выход из
> цикла если не успешна..
> Ну и наконец... вы отошли от атомарных операций в своем скрипте.
> Почему вы не хотите устанавливать соединение каждый раз при необходимости записи?
> создали соединение - записали-вышли.
> Через 5 секунд повторили итерацию.если Вы говорите про полный скрипт из пятого сообщения то:
1)там в цикле while ($while_is_enabled), а $while_is_enabled - это как раз и есть условие выхода из цикла, просто я не писал условия установки его в 0 (там много всего).
2)первой строкой цикла и есть $dbh = check_connect_db($dbh);
идет проверка доступности соединения, и если оно не доступно, то $connect_db, до тех пор
пока не подлючится
3)на самом деле установка соединения перед каждой итерацией не решит проблему глобально
ведь проблема в том, что $dbh->ping, не возвращает false при обрыве соединения, а просто скрипт "виснет" (и висит, висит ...) при вызове этого метода.
Если мы будем устанавливать соединенние при каждой итерации, то это решит проблему при вставке первой строки из стрех (там в одной транзакции вставляются три тсроки), а если связь пропадет между вставкой 1-й и 2-й строки, то что тогда.
По идее в таком случае, медод execute должен вернуть ошибку, но он этого не делает, а скрипт просто виснет, как и при ping.
В общем, подводя итог - проблема в том, что при обрыве связи, обращение к любому методу $dbh ведет к зависанию скрипта, а не к ошибке выполнения метода.
И выход только один, оборачивать каждое обращение к базе в таймаут.
(вот тут написано об этом же http://www.opennet.ru/openforum/vsluhforumID9/6774.html)
Я уже определился с модулем для этого https://metacpan.org/pod/Sys::SigAction, функция timeout_call.
Но, честно говоря, это не очень удобно :-(