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