Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Perl, MySQL и производительность


Автор: shootnix 24.1.2008, 22:55
Всем привет!
Вот тут у меня, наконец, созрел такой весьма философский топик, состоящий из ряда вопросов, посвященных работе с MySQL. 
Конкретно интересует:
1. Насколько оправдан, прочен и незыблем (сказал-то как!) такой вариант организации работы:
Есть класс, который работает с базой. У него есть конструктор, который создает соединение и записывает этот $dbh в отдельное свойство экземпляра. Примерно так:

Код

    my $class = shift;

    my $dbh = DBI->connect( "DBI:mysql:host=$host;database=$base", $login, $pass );

    if (!$dbh){
        print "Content-type: text/html\n\n";
        print 'MySQL connect error';
        exit (0);
    }

    my $self  = {};
    $self->{DBH} = $dbh;
    bless $self, $class;
    return $self;


После этого я в основном скрипте вот так создаю экземпляр класса:

Код

    my $db = DBase->new();


И после этого уже работаю с его методами:

Код

    my $rabbits = $db->get_rabbits( name => 'Bunny' );


Методы, естессно, просто пользуют свойсво объекта $self->{DBH}, т.е. ссылку на подключение.
И уже в деструкторе класса я проделываю дисконнект и прочие радости...
Мучит такой вопрос: насколько такая схема будет работать стабильно, не может ли тут скрываться какой-то подводный камешек нехилого азмера? Я просто всех тонкостей работы с БД не знаю, но ж...ой чую подвох ;-)))

И второй вопрос:
2. Проистекает из первого — каким образом у себя на домашней тачке можно провести грамотный краш-тест для таких вот скриптов, чтобы узнать, насколько все же я неправ?

И третий, в дополнение:
При создании в основном скрипте $dbh возможно ли передавать этот объект другим модулям для их работы? К примеру, модуль, который что-то там делает, используя базу данных:

Код

    doSomething( $dbh, $someData );


В этом случае не произойдет повторного соединения с базой? Если нет, то почему?

Заранее спосибо. Жду ответа, как соловей лета ;-))

Автор: KSURi 24.1.2008, 23:23
Цитата(shootnix @  24.1.2008,  22:55 Найти цитируемый пост)
В этом случае не произойдет повторного соединения с базой? Если нет, то почему?

Вы передаете в функцию дескриптор уже установленного подключения, так почему оно должно происходить?

По 1ому: ну тут имхо только практика покажет...

Автор: Ramirez 24.1.2008, 23:53
Описанный подход - логичен и широко применяется. 
К онкретно в приведенном примере - камней быть не может. Камни могут быть в этих самых методах и в организации приложения вцелом.

насчет краштеста, если это веб-приложение, то 
Код

ab - Apache HTTP server benchmarking tool

http://httpd.apache.org/docs/2.0/programs/ab.html

на мой взгляд вполне достаточно....

Автор: nitr 25.1.2008, 00:34
Поддерживаю оба ответа!

Автор: ginnie 25.1.2008, 11:40
Уважаемый shootnix, из личного опыта скажу, что создавать соединение внутри объекта, да еще в конструкторе - вариант не очень удачный. Несомненно, работать будет, но интерфейс класса получается не совсем прозраным, да и вывод сообщений об ошибках и exit() внутри класса - это экстрим  smile.
Более грамотным решением будет передача уже созданного в основной программе соединения (лучше двух) в конструктор объекта.
Два соединения (одно для запросов на чтение данных, другое - для записи) необходимо для корректной работы с несколькими реплицирующимися БД, когда чтение идет со slave'ов, а записываются данные на master. В случае, если у Вас нет пока такой схемы передавайте в оба параметра один и тот-же $dbh.
Код

my $dbhr = DBI->connect( "DBI:mysql:host=$slave_host;database=$base", $read_login, $read_pass ); # для чтения из БД
my $dbhw = DBI->connect( "DBI:mysql:host=$master_host;database=$base", $write_login, $write_pass ); # для записи в БД

my $db = DBase->new($dbhr, $dbhw) ;
unless ($db) {
    print "Content-type: text/html\n\n";
    print 'General system fault';
    exit (0);
}

Автор: shootnix 25.1.2008, 14:52
ginnie, спасибо, учту...
Собсна, ошибка внутри класса выводится, куда они денется-то? smile)) Но, в любом случае, идея принята на заметку smile +1 ;-)))

Автор: shootnix 26.1.2008, 09:29
Ну так или иначе, вроде все понятно, спасибо всем. Обнадежили smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)