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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Catalyst + CGI+ DBI server has gone away 
:(
    Опции темы
gcc
Дата 3.6.2009, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



Код

mysql::st execute failed: MySQL server has gone away at /usr/local/lib/perl5/site_perl/5.8.8/Catalyst/Plugin/Authentication/Store/DBI.pm line 175."


когда работает в тестовмо режиме, в CGI всегда пишет ошибку через 2-5 мин., и на сайте никого нету вообще - уже надоело...

как только я перезагружу его - все нормально...

по-моиме модуль DBI все время делает соединние... предназначенно для mod_perl наверное
сервер отвичает что соединения изчерпаты я поставил на каждого пользователя 100 соединений, никоглда таакого не было

что тут мешает? disconnect как бы в DESTROY... но ошибку пишет, довольно странно...

я еще использую авторизацию по DBI

вот этот модуль:
Код

package Catalyst::Model::DBI;

use strict;
use base 'Catalyst::Model';
use NEXT;
use DBI;

our $VERSION = '0.20';

__PACKAGE__->mk_accessors( qw/_dbh _pid _tid/ );

=head1 NAME

Catalyst::Model::DBI - DBI Model Class

=head1 SYNOPSIS

        # use the helper
        create model DBI DBI dsn user password
    
        # lib/MyApp/Model/DBI.pm
        package MyApp::Model::DBI;

        use base 'Catalyst::Model::DBI';

        __PACKAGE__->config(
                dsn           => 'dbi:Pg:dbname=myapp',
                password      => '',
                user          => 'postgres',
                options       => { AutoCommit => 1 },
        );

        1;

        my $dbh = $c->model('DBI')->dbh;
        #do something with $dbh ...

=head1 DESCRIPTION

This is the C<DBI> model class.
=head1 METHODS

=over 4

=item new

Initializes DBI connection

=cut

sub new {
        my $self = shift;
        my ( $c ) = @_;
        $self = $self->NEXT::new( @_ );
        $self->{namespace}               ||= ref $self;
        $self->{additional_base_classes} ||= ();
        $self->{log} = $c->log;
        $self->{debug} = $c->debug;
        $self->connect;
        return $self;
}

=item $self->dbh

Returns the current database handle.

=cut

sub dbh {
        return shift->stay_connected;
}

=item $self->stay_connected

Returns a connected database handle.

=cut

sub stay_connected {
        my $self = shift;

        if ( $self->_dbh ) {
                if ( defined $self->_tid && $self->_tid != threads->tid ) {
                        $self->_dbh( $self->connect );
                } elsif ( $self->_pid != $$ ) {
                        $self->_dbh->{InactiveDestroy} = 1;
                        $self->_dbh( $self->connect );
                } elsif ( ! $self->connected ) {
                        $self->_dbh( $self->connect );
                }
        } else {
                $self->_dbh( $self->connect );
        }
        return $self->_dbh;
}

=item $self->connected

Returns true if the database handle is active and pingable.

=cut

sub connected {
        my $self = shift;
        return unless $self->_dbh;
        return $self->_dbh->{Active} && $self->_dbh->ping;
}

=item $self->connect

Connects to the database and returns the handle.

=cut

sub connect {
        my $self = shift;
        my $dbh;
        eval {
                $dbh = DBI->connect(
                        $self->{dsn},
                        $self->{user},
                        $self->{password},
                        $self->{options}
                );
        };
        if ($@) { $self->{log}->debug( qq{Couldn't connect to the database "$@"} ) if $self->{debug} }
        else { $self->{log}->debug ( 'Connected to the database via dsn:' . $self->{dsn} ) if $self->{debug}; }
        $self->_pid( $$ );
        $self->_tid( threads->tid ) if $INC{'threads.pm'};
        return $dbh;
}

=item $self->disconnect

Executes rollback if AutoCommit is active,
disconnects and unsets the database handle.

=cut

sub disconnect {
        my $self = shift;
        if( $self->connected ) {
                $self->_dbh->rollback unless $self->_dbh->{AutoCommit};
                $self->_dbh->disconnect;
                $self->_dbh( undef );
        }
}

sub DESTROY {
        my $self = shift;
        $self->disconnect if (defined $self->_dbh);
}

=back


Код


package Catalyst::Helper::Model::DBI;

use strict;
use File::Spec;


sub mk_compclass {
    my ( $self, $helper, $dsn, $user, $pass ) = @_;
    $helper->{dsn}  = $dsn  || '';
    $helper->{user} = $user || '';
    $helper->{pass} = $pass || '';
    my $file = $helper->{file};
    $helper->render_file( 'dbiclass', $file );
    return 1;
}



Это сообщение отредактировал(а) gcc - 3.6.2009, 09:05
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 3.6.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



да, но на сайте никого нету он в тестовом режиме...  соединений Max_connect = 100 для MySQL

строка 175

Код

$sth->execute($frozen) or die($dbh->errstr());


Код
 my $dbh = $self->{'dbh'};
 
        $sql = 'SELECT * FROM ' . $self->{'user_table'} . ' WHERE ' .
            $self->{'user_key'} . ' = ?';

        $sth = $dbh->prepare($sql) or die($dbh->errstr());
        $sth->execute($frozen) or die($dbh->errstr());
        $sth->bind_columns(\( @user{ @{ $sth->{'NAME_lc'} } } )) or
            die($dbh->errstr());
        unless ($sth->fetch()) {
                $sth->finish();
                return undef;
        }
        $sth->finish();


авторизация как бы первая идет... проблема не тут... оно пишет что не может подклчиться
PM WWW ICQ Skype GTalk Jabber   Вверх
mvsgt
Дата 3.6.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А скрипт действительно как CGI запускается?
PM MAIL   Вверх
GoDleSS
Дата 4.6.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Судя по всему скрипт запускается, используя Каталистовский сервер.
Что-нибудь, вроде ./script_starter.pl -p 8000 бла-бла
И говорить в таком случае о стандартной модели CGI не стоит.

gcc,  так оно?
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
mvsgt
Дата 4.6.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если так, то надо отследить кто открывает соединения и не закрывает.
PM MAIL   Вверх
Ramirez
Дата 4.6.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



у меня была похожая проблема, только без каталиста.
почитайте, возможно поможет: 

http://forum.vingrad.ru/forum/topic-62153.html
PM ICQ   Вверх
shamber
Дата 4.6.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Ramirez, c начала хотел предложить посмотреть на этот пост. Но не смог найти его в поиске :(
PM MAIL Jabber   Вверх
gcc
Дата 5.6.2009, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



хотел включить в CGI в apache не поулчилось попробую поже

да запускаетя так ./script_starter.pl -r

я зашел на страницу, авторизировался, дальше если ничего не делать 2-5 мин. (не считал сколько) появляется такая ошибка, никто ничего не делает

а как InactiveDestroy включить глбольно? в каждой запросе нужно включать? $dbh->{InactiveDestroy => 1}; ? 
программа не маленькая просто (еще не оформлял код)


PM WWW ICQ Skype GTalk Jabber   Вверх
mvsgt
Дата 5.6.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А почему не попробовать отыскать то место, где лишние соединения создаются?
PM MAIL   Вверх
GoDleSS
Дата 5.6.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



gcc, у меня не большой опыт работы с Каталистом и сталкивался не совсем с такой проблемой, т.к. сроки тогда поджимали - решил ее, забив на производительность.
И так проблема: надо было открывать удп-сокет для общения с радиус сервером. Если объект не глушить - появлялись (в зависимости от подхода) либо открытые порты-висюки, либо отбрасывания пакетов радиусом.
Решил (не разбираясь в причинах особенно) следующим образом: каждый раз в авто-стейдже открывал сокет(создавал Net::UDP объект), а в энд-стейдже глушил его.

Может вам также сделатьс $dbh для начала, а потом уж думать в сторону оптимизации?!
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
mvsgt
Дата 5.6.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



включить в DBI трассировку - всего и делов, и посмотреть где что происходит.
PM MAIL   Вверх
gcc
Дата 5.6.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



написал, ничего не изменилось 

Код

$dbh->{InactiveDestroy => 1}; 


Код

__PACKAGE__->config(
    dsn           => 'dbi:mysql:dbname=catalyst',
    user          => 'catalyst',
    password      => '',
    options       => {RaiseError => 1, 
                       PrintError => 1,
                       InactiveDestroy => 1 },
         
);



кстате, когда не авторизироватся, то такой проблемы нету, может проблема действительно тут  $sth->bind_columns(\( @user{ @{ $sth->{'NAME_lc'} } } )) or  ?

в этой строке 175         
Код

$sth->execute($frozen) or die($dbh->errstr());
 
на которую идет ошибка
Код


 my $dbh = $self->{'dbh'};
 
        $sql = 'SELECT * FROM ' . $self->{'user_table'} . ' WHERE ' .
            $self->{'user_key'} . ' = ?';
        $sth = $dbh->prepare($sql) or die($dbh->errstr());
        $sth->execute($frozen) or die($dbh->errstr());
        $sth->bind_columns(\( @user{ @{ $sth->{'NAME_lc'} } } )) or
            die($dbh->errstr());
        unless ($sth->fetch()) {
                $sth->finish();
                return undef;
        }
        $sth->finish();



а почему тут 2 финиша $sth->finish()?

а что в трассировке увижу? разве не тоже самое? как ее включить?


Это сообщение отредактировал(а) gcc - 5.6.2009, 15:09
PM WWW ICQ Skype GTalk Jabber   Вверх
GoDleSS
Дата 5.6.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

а почему тут 2 финиша $sth->finish()?

Потому как в случае отрабатывания анлеса выходит из блока(саба) до внешнего $sth->finish()
А иначе в первый финиш не будет отработан.
Все логично.

--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
gcc
Дата 5.6.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



ну поключений к MySQL нету, к ней можно спокойно покдлючиться с тем же пользователем и паролем

тут вот еще нашел

Цитата

      You tried to run a query after closing the connection to the server. This indicates a logic error in the application that should be corrected.


http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

не понтяно

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


Это сообщение отредактировал(а) gcc - 5.6.2009, 17:57
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 6.6.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



http://x0.org.ua/perl/dbitrace.log

вот участок

Код

Binding parameters: SELECT * FROM users WHERE id = '1'
        --> do_error
MySQL server has gone away error 2006 recorded: MySQL server has gone away
        <-- do_error
IGNORING ERROR errno 0
 <- dbd_st_execute returning imp_sth->row_num 18446744073709551614
    !! ERROR: 2006 'MySQL server has gone away' (err#0)
    <- execute= undef at DBI.pm line 175


я зашел, авторизировался...

а встроенный веб сервер в Catalyst запускает не в CGI? это из-за него наверное эта ошибка

только что посмотрел в mod_perl такой ошибки нетуу, но под него программировать не реально,  при изменении исходнего кода какого-то модуля, надо перегружать апач, написано что Apache::Reaload не поддреживается в Catalystе



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


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

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


 




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


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

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