Редактирование сообщения в Catalyst + CGI+ DBI server has gone away

rtyug
На сайте с 13.05.2009
Offline
263
729


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;
}

Спалил тему: Pokerstars вывод WMZ, etc на VISA 0% или SWIFT + Конверт USD/GBP,etc (net profit $0,5 млрд) (https://minfin.com.ua/blogs/94589307/115366/) Monobank - 50₴ на счет при рег. тут (https://clck.ru/DLX4r) | Номер SIP АТС Москва 7(495) - 0Ꝑ, 8(800) - 800Ꝑ/0Ꝑ (http://goo.gl/XOrCSn)
T.R.O.N
На сайте с 18.05.2004
Offline
314
#1

rtyug,

А что именно находится по DBI.pm line 175. Кокая команда отваливается?

Я никогда не пользовал этот фреймворк. Попробуйте обратится к базе напрямую через DBI

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
rtyug
На сайте с 13.05.2009
Offline
263
#2

$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();

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

если вы сделаете много соединений и если они будт висеть, то сервер повиснит, доджен быть придел

на сервер 100 содениений в конфиге - это номрально

их можно "рубать" по таймауту в 5 сек, но тогда тогда "пул соединений" работатеь не будет

у в конфиге стоит еще "интерактив таймаут" 600 сек.

тут тупо движок глючит

не понятно где

переделать DBI можно, но тут не понятно я пробовал убрать много чего...

то есть там оставить дисконект и подключение, а все остальное убрать можно...

попробую

rtyug добавил 03.06.2009 в 18:26

да, но на сайте никого нету он в тестовом режиме... соединений 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();

авторизация как бы первая идет... проблема не тут... оно пишет что не может подклчиться

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий