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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl, MySQL и производительность, терзают смутые сомнения... 
V
    Опции темы
shootnix
Дата 24.1.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 3.9.2005
Где: Казахстан

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



Всем привет!
Вот тут у меня, наконец, созрел такой весьма философский топик, состоящий из ряда вопросов, посвященных работе с 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 );


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

Заранее спосибо. Жду ответа, как соловей лета ;-))
PM WWW ICQ   Вверх
KSURi
Дата 24.1.2008, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



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

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

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


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Ramirez
Дата 24.1.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

Репутация: 4
Всего: 5



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

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

ab - Apache HTTP server benchmarking tool

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

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

PM ICQ   Вверх
nitr
Дата 25.1.2008, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Поддерживаю оба ответа!


--------------------
PM   Вверх
ginnie
Дата 25.1.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Уважаемый 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);
}


Это сообщение отредактировал(а) ginnie - 25.1.2008, 11:41


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 3.9.2005
Где: Казахстан

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



ginnie, спасибо, учту...
Собсна, ошибка внутри класса выводится, куда они денется-то? smile)) Но, в любом случае, идея принята на заметку smile +1 ;-)))
PM WWW ICQ   Вверх
shootnix
Дата 26.1.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 3.9.2005
Где: Казахстан

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



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


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

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


 




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


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

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