Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl ISAPI подключение к БД 
:(
    Опции темы
Itsys
Дата 20.8.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



Добрый день,

Может, кто сталкивался.
Разрабатываю интернет магазин платформа Win Server 2003+IIS+Active Perl.
Перед разработкой, прочитав документацию по Active Perl, решил запускать его в режиме расширения ISAPI.
Выдержка из документации:
Код

Why should I use Perl for ISAPI rather than Perl for Win32 (perl.exe)?
The short answer is: it's faster. The long answer gets kind of technical, but it goes like this:

The main advantage of PerlIS over perl.exe is that PerlIS runs as a DLL in the web server's process space. Because Win32 platforms set up a protected memory space for each process that is started, there's a lot of overhead in starting a new process or program. Passing scripts to an interpreter, such as perl.exe, requires starting a new process for every script, which gets expensive in terms of system resources.

DLLs, on the other hand, don't need their own process space; they use the space of the process that calls them. They don't require nearly as much overhead to start, and once loaded they stay loaded until the calling process ends. PerlIS therefore runs Perl scripts with a quicker turn-around time than perl.exe.

Extra care should be taken when you write PerlIS applications. It is difficult to crash the web server using CGI, but because the PerlIS DLL runs in the process space of the server, your web server is more susceptible to crashes and hangs caused by programming errors.


Повышение производительности было не главное при выборе. К сожалению, уже не помню где читал, но была такая вещь: что при работе именно в режиме ISAPI, модули, которые подключаются через use и блоки кода, которые находятся в блоках BEGIN или END кешируются, в дальнейшем при повторном выполнении какого-нибудь скрипта, соответственно не должны перекомпилироваться и повторно исполняться.

Из-за этого для коннекта к БД был создан отдельный модуль, подключаемый во все скрипты через use. По идее, изложенной выше, коннект к базе данных должен производиться только один раз при первом обращении к этому модулю, и в дальнейшем должно использоваться открытое соединение.

Но процедура подключения к БД выполняется при каждом обращении к скриптам сайта.

В чем может быть проблема?

PM MAIL WWW Skype   Вверх
ginnie
Дата 20.8.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Itsys, Вы не указали, как производится подключение к БД. В функции import() или как?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 20.8.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



через DBI, перменная хендл экспортируется из модуля

Добавлено через 40 секунд
Вся суть в том, что сервер БД - MS SQL, находится на другом сервере...
PM MAIL WWW Skype   Вверх
ginnie
Дата 20.8.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Покажите код.

P.S. сделайте отладочный вывод PID (идентификатора процесса)

Это сообщение отредактировал(а) ginnie - 20.8.2009, 17:23


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 20.8.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



Модуль подключения:
Код

package Values;

use strict;
use vars qw ($VERSION @ISA @EXPORT_OK %EXPORT_TAGS);
use DBI;
use CGI;
require Exporter;

@EXPORT_OK = qw($SQLFastbook $SQLFastbookOld $siteadress $sitepath $pricelistpath $RuStrLow $RuStrCap 
                %PARTS %PARAMS %SQLPARAMS $cgi @BooksColums @BooksAutorType &DateSQL %Images
                &normalizeParams);
%EXPORT_TAGS = (ALL => [qw($SQLFastbook $SQLFastbookOld $siteadress $sitepath $pricelistpath $RuStrLow $RuStrCap 
                            %PARTS %PARAMS %SQLPARAMS $cgi @BooksColums @BooksAutorType &DateSQL %Images
                            &normalizeParams)],
                RUSTR => [qw($RuStrLow $RuStrCap)],
                SQL => [qw($SQLFastbook %SQLPARAMS $cgi @BooksColums @BooksAutorType &DateSQL $sitepath)],
                Img => [qw($sitepath %Images $cgi %PARAMS @BooksColums)]);
@ISA = qw(Exporter);

our $SQLFastbook  = DBI->connect("dbi:ODBC:driver={SQL Server};Server=***;database=***;uid=***;pwd=***;") or die "$DBI::errstr\n";
$SQLFastbook->{PrintError} = 0;
$SQLFastbook->{AutoCommit} = 1;
$SQLFastbook->{LongReadLen} = 2000000;


Использвование:
Код

use Values qw(:SQL);
        my $query = <<"(END)";
    DECLARE \@myid uniqueidentifier
    SET \@myid = NEWID()
    INSERT S (Id, Expire)
    VALUES (\@myid, $expire)
    SELECT * FROM S WHERE Id = \@myid
(END)
        my $sth = $SQLFastbook->prepare($query);
        $sth->execute || die "~~" . $sth->errstr . "<br>\n" . $query;


PM MAIL WWW Skype   Вверх
ginnie
Дата 20.8.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Itsys, не уверен на счет use CGI; в модуле, т.к. его код, скорее всего до запроса выполняется.

Надо сделать в модуле отладочный вывод PID (идентификатора процесса).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 20.8.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



Просто я сделал модуль Values, в котором поключаю БД, задаю некоторые настройки, считываю и преобразую параметры, переданные в скрипт через CGI и т.д. Т.е. для того, чтобы все работало, как я хочу надо делать отдельный модуль, в котором будет только подключение к БД?


Цитата(ginnie @  20.8.2009,  17:41 Найти цитируемый пост)
Надо сделать в модуле отладочный вывод PID (идентификатора процесса).

Имеется в виду, удостовериться, что модуль запускается одним и тем же процессом... это 100%, при запуске сервера появляется 1 процесс, кроме него никаких большще дополнительныз процессов не возникает.
PM MAIL WWW Skype   Вверх
ginnie
Дата 20.8.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Itsys, отладочный вывод - надежный механизм анализа происходящего. Если он покажет, что действительно модуль несколько раз компилируется, это один алгоритм, если компилируется только один раз - алгоритм дальнейших действий другой.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 20.8.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



Сори но я не понимаю, что ты предлагаешь сделать... 

то, что коннект идет несколько раз - отслеживал по трайсеру MS SQL...

что надо включить 
PM MAIL WWW Skype   Вверх
ginnie
Дата 20.8.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Itsys, реконнекты могут быть не связаны с перезагрузкой модуля, возможно это DBI пересоединяется при каких-то условиях. Есть сложности с добавлением отладочного вывода? Как именно сделать отладочный вывод под ISAPI не знаю, может warn работает?

Это сообщение отредактировал(а) ginnie - 20.8.2009, 18:21


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 20.8.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



что надо добавить в отладку? pid?
PM MAIL WWW Skype   Вверх
ginnie
Дата 20.8.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Из лога нам надо понять, происходит ли многократный вызов DBI->connect из Values, и если происходит, надо убедиться, что это делается в рамках одного процесса.

Это сообщение отредактировал(а) ginnie - 20.8.2009, 18:25


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 20.8.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



Вот лог:
Код

1250787634::4544::/card/13262/sid145ACA7C-FE4C-4F88-9096-CD75B017F8D6
1250787637::4544::/catalog/1390/1/10/sid145ACA7C-FE4C-4F88-9096-CD75B017F8D6
1250787642::4544::/card/13262/sid145ACA7C-FE4C-4F88-9096-CD75B017F8D6
1250787646::4544::/catalog/1390/1/10/sid145ACA7C-FE4C-4F88-9096-CD75B017F8D6
1250787649::4544::/basket/sid145ACA7C-FE4C-4F88-9096-CD75B017F8D6

формат time::$$::$ENV{QUERY_STRING}

Стоит сразу после коннекта в БД.
PM MAIL WWW Skype   Вверх
ginnie
Дата 20.8.2009, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Itsys, судя по логу ISAPI работает не так, как написано. Либо мы как-то неверно его воспринимаем. На твоем месте я бы заменил IIS на Apache+mod_perl и спокойно работал дальше (я так и сделал в свое время).

Это сообщение отредактировал(а) ginnie - 20.8.2009, 21:58


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Itsys
Дата 20.8.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



На самом деле я бы не парился, если бы все работало нормально... Но сайт работает работает и работает довольно шустро, но потом бац и виснет... на полминутки потом опять отвисает и все ок. В моменты подвисания в логе ошибок всплывает ошибка о том, что время подключения к базе остекло.

Я уже всю голову себе сломал... что же это может быть
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0962 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.