Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Perl ISAPI подключение к БД |
Автор: Itsys 20.8.2009, 17:06 | ||
Добрый день, Может, кто сталкивался. Разрабатываю интернет магазин платформа Win Server 2003+IIS+Active Perl. Перед разработкой, прочитав документацию по Active Perl, решил запускать его в режиме расширения ISAPI. Выдержка из документации:
Повышение производительности было не главное при выборе. К сожалению, уже не помню где читал, но была такая вещь: что при работе именно в режиме ISAPI, модули, которые подключаются через use и блоки кода, которые находятся в блоках BEGIN или END кешируются, в дальнейшем при повторном выполнении какого-нибудь скрипта, соответственно не должны перекомпилироваться и повторно исполняться. Из-за этого для коннекта к БД был создан отдельный модуль, подключаемый во все скрипты через use. По идее, изложенной выше, коннект к базе данных должен производиться только один раз при первом обращении к этому модулю, и в дальнейшем должно использоваться открытое соединение. Но процедура подключения к БД выполняется при каждом обращении к скриптам сайта. В чем может быть проблема? |
Автор: ginnie 20.8.2009, 17:20 |
Itsys, Вы не указали, как производится подключение к БД. В функции import() или как? |
Автор: Itsys 20.8.2009, 17:21 |
через DBI, перменная хендл экспортируется из модуля Добавлено через 40 секунд Вся суть в том, что сервер БД - MS SQL, находится на другом сервере... |
Автор: ginnie 20.8.2009, 17:22 |
Покажите код. P.S. сделайте отладочный вывод PID (идентификатора процесса) |
Автор: Itsys 20.8.2009, 17:35 | ||||
Модуль подключения:
Использвование:
|
Автор: ginnie 20.8.2009, 17:41 |
Itsys, не уверен на счет use CGI; в модуле, т.к. его код, скорее всего до запроса выполняется. Надо сделать в модуле отладочный вывод PID (идентификатора процесса). |
Автор: ginnie 20.8.2009, 17:54 |
Itsys, отладочный вывод - надежный механизм анализа происходящего. Если он покажет, что действительно модуль несколько раз компилируется, это один алгоритм, если компилируется только один раз - алгоритм дальнейших действий другой. |
Автор: Itsys 20.8.2009, 18:13 |
Сори но я не понимаю, что ты предлагаешь сделать... то, что коннект идет несколько раз - отслеживал по трайсеру MS SQL... что надо включить |
Автор: ginnie 20.8.2009, 18:19 |
Itsys, реконнекты могут быть не связаны с перезагрузкой модуля, возможно это DBI пересоединяется при каких-то условиях. Есть сложности с добавлением отладочного вывода? Как именно сделать отладочный вывод под ISAPI не знаю, может warn работает? |
Автор: Itsys 20.8.2009, 18:20 |
что надо добавить в отладку? pid? |
Автор: ginnie 20.8.2009, 18:24 |
Из лога нам надо понять, происходит ли многократный вызов DBI->connect из Values, и если происходит, надо убедиться, что это делается в рамках одного процесса. |
Автор: Itsys 20.8.2009, 20:02 | ||
Вот лог:
формат time::$$::$ENV{QUERY_STRING} Стоит сразу после коннекта в БД. |
Автор: ginnie 20.8.2009, 21:57 |
Itsys, судя по логу ISAPI работает не так, как написано. Либо мы как-то неверно его воспринимаем. На твоем месте я бы заменил IIS на Apache+mod_perl и спокойно работал дальше (я так и сделал в свое время). |
Автор: Itsys 20.8.2009, 22:24 |
На самом деле я бы не парился, если бы все работало нормально... Но сайт работает работает и работает довольно шустро, но потом бац и виснет... на полминутки потом опять отвисает и все ок. В моменты подвисания в логе ошибок всплывает ошибка о том, что время подключения к базе остекло. Я уже всю голову себе сломал... что же это может быть |
Автор: ginnie 21.8.2009, 09:10 |
Itsys, я не совсем понял, вот что, у Вас при каждом запросе происходит соединение с базой, правильно? При этом возникает момент "подвисания". На этом запросе происходит соединение с базой? Оно завершается ошибкой об истечении времени подключения к базе? |
Автор: Itsys 21.8.2009, 22:16 |
ginnie, да. 1. При каждом запросе к любому скрипту сайта производится новый коннект к БД, это мы выяснили предыдущими опытами. 2. Иногда, по непонятным причинам (некоторый промежуток времени) все запросы к страницам подвисают, в результате выдается ошибка "время истекло". При этом в логах perl появляются записи о невозможности подключения к базе данных. 3. В эти промежутки времени не замечено каких-либо проблемм в аппаратной или системной области (но не могу это гарантировать, т.к детальное обследование не проводилось) т.к. ошибка вылезает безсистемно - может целый день все рботать нормально (во всяком случае не обнаружаемо мною либо другими сотрудниками офиса) и в то же время, потом моут быть с промежутком 10 минут, или 2 часа т.е. совсем не прогнозируемо. Вот я и не могу никак понять в чем может быть проблема... |