Re: [Cascavel-pm] Dúvida sobre BDI::disconnect
Luis Campos de Carvalho
monsieur_champs em yahoo.com.br
Quarta Outubro 26 13:01:05 PDT 2005
--- Solli Moreira Honorio <shonorio em terra.com.br> escreveu:
> Pessoal,
> Quando eu executo o código abaixo, recebo o warnnig 'DBI::db=HASH(0x226f9c4)->disconnect
> invalidates 1 active
> statement handle (either destroy statement handles or call finish on them before disconnecting)
> at
> AVUpdate/Module/Helpesk/Spasa.pm line 90.', onde line 90 é a linha do disconnect.
>
> <code>
> sub verificar_chamado {
> my $self = shift;
> my $chamado = shift;
>
> my $dbcon = DBI->connect ( $self->{dbiconnetion}, $self->{dbiuser}, $self->{dbipassword} )
> or die qq{Can't connect to database: $DBI::errstr};
>
> my $sth = $dbcon->prepare( qq{SELECT cod_status FROM ordem_servico WHERE
> cod_ordem_servico=$chamado} );
> $sth->execute();
>
> my $status = $sth->fetchrow_array();
#####################
$sth->finish; # isto evita o warning.
#####################
> $dbcon->disconnect
> or warn qq{Disconnection failed: $DBI::errstr};
>
> return $status;
> }
> </code>
> Como eu tenho o hábito de fechar as conexões de banco de dados, fiquei confuso com esta
> mensagem. Não preciso explicitar a desconexão neste caso ?
SEMPRE é necessário explicitar a desconexão.
AINDA MAIS neste caso: um trecho de código que potencialmente pode ser usado por muita gente, o
tempo todo (milhares de desconexões implícitas para o banco de dados tratar).
O banco de dados agradece.
> Posso simplesmente fazer algo como :
> <code>
[Bad code snipped off]
> </code>
> sem problema ? ainda mais para um sistema que rodará como daemon ?
Claro que não.
O que você pode fazer para ajudar um pouco é não desconectar do banco de dados, extendendo o
DBI, assim:
package DBI::ConnectionManager;
use warnings;
use strict;
our $connection;
sub connect{
return $connection if $connection;
return SUPER::connection( @_ );
}
1;
__END__
Está tosco, e pode ser muito melhorado com uma boa busca no CPAN. Mas a idéia básica por trás
disso é: já que você não vai "terminar" sua aplicação, por que não reutilizar sua conexão com o
banco de dados?
Espero que isso ajude.
Putamplexos.
--
Luis Campos de Carvalho
Member of "São Paulo Perl Mongers",
Unix SysAdmin & OCP/DBA Oracle
http://br.geocities.com/monsieur_champs/
_______________________________________________________
Promoção Yahoo! Acesso Grátis: a cada hora navegada você
acumula cupons e concorre a mais de 500 prêmios! Participe!
http://yahoo.fbiz.com.br/
Mais detalhes sobre a lista de discussão Cascavel-pm