|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Andrey Sapozhnikov 2:5020/400 09 Jan 2002 18:48:44 To : Eugene Grosbein Subject : Re: mod_perl+MySQL=??? -------------------------------------------------------------------------------- Eugene Grosbein wrote: > Привет! > > Почему может быть такое: prepare отрабатывает, а на execute говорит: > > DBD::mysql::st execute failed: MySQL server has gone away at > /my/path/access.pl line 178. Причем этот mod_perl-скрипт работает уже > несколько лет нормально под Apache::DBI. Если отключаю Apache::DBI, то валится > ругань и ничего не работает (persistent connections мне приходится отрубать, > потому как нет возможности сказать, что для DBD::mysql их юзать, а для > DBD::ODBC нет, а тут надо, чтобы ODBC-коннекты закрывались сразу). Во-первых, внимательно перечитываем perldoc DBI: ... The "dbi_connect_method" attribute can be used to specify which driver method should be called to estabЅ lish the connection. The only useful values are 'conЅ nect', 'connect_cached', or some specialized case like 'Apache::DBI::connect' (which is automatically the default when running within Apache). ... и делаем необходимые соединения не персистентными. > В логах самого MySQL ничего нету, свободных коннектов в MySQL тоже дофига. > > Самое смешное - не могу найти эту ругань в тексте модулей. > > Eugene Во-вторых, ищем это сообщение (MySQL server has gone away) в библиотеке от mysql. DBD::MySQL все-го лишь добавляет в какой строке какого файла/пакета это случилось. Выглядит так, как будто кто-то по ошибке закрыл соединение с sql сервером. Чаще всего такое случается если в скрипте был использован fork и в дочернем процессе оказалась копия объекта $dbh. Завершаясь, дочерний процесс вызвал деструктор этого объекта и он не просто захлопнул сокет, но и послал командочку sql-серверу на окончание сеанса. Это только предположение, но если оно верно, то читаем perldoc DBI еще раз: ""InactiveDestroy"" (boolean) This attribute can be used to disable the database engine related effect of DESTROYing a handle (which would normally close a prepared statement or disconЅ nect from the database etc). For a database handle, this attribute does not disable an explicit call to the disconnect method, only the implicit call from DESTROY. This attribute is specifically designed for use in Unix applications that "fork" child processes. Either the parent or the child process, but not both, should set "InactiveDestroy" on all their shared handles. Note that some databases, including Oracle, don't supЅ port passing a database connection across a fork. Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/5284a98ce487.html, оценка из 5, голосов 10
|