[Cascavel-pm] Compartilhar conexão DBD::Oracle entre processos (usando XML::Twig)

Luis Motta Campos luismottacampos em yahoo.co.uk
Sexta Abril 6 04:55:52 PDT 2007


On Apr 5, 2007, at 11:28 PM, Joenio Costa wrote:
> Olá Pessoal,
>
> Preciso analisar um XML e gravar os seus dados num banco Oracle, estou

   Esta lista é só desgraça mesmo... ;-) XML *E* Oracle, juntos...  
ninguém merece.

> utilizando XML::Twig com parametro twig_handlers para fazer o parser
> do XML. O XML tem aproximadamente 35 MB e isto iria consumir muita
> memória caso eu não utilize o parametro twig_handlers. Não encontrei
> na documentação do XML::Twig mas notei que ao utilizar esse parametro
> é criado um processo filho, e é isto que esta causando problemas com
> minha conexão com o Oracle.

   Aqui tem um problema conceitual. Talvez seja melhor usar um parser  
incremental (DOM? SAX? Quem sabe o nome certo?), que vai armazenar  
apenas um pedaço do seu arquivo no disco, e não vai detonar a sua  
memória. Você precisa mesmo usar o XML::Twig? Ele parece ser apenas  
um toolkit construído sobre o XML::Parser, que me parece ser mais  
interessante para o seu caso...

> Eu obtenho o seguinte erro ao executar algo parecido com o exemplo  
> abaixo:
> DBD::Oracle::db disconnect failed: ORA-03113: end-of-file on
> communication channel (DBD ERROR: OCISessionEnd)

   Você parece já ter encerrado esta conexão uma vez.
   Pode me dar mais informação sobre este processo "extra" que você  
está vendo? Isso é estranho para mim...

> --------
>
> use DBI;
> use XML::Twig;
>
> my $dbh = DBI->connect('dbi:Oracle:database', 'user', 'pass');
> my $sth = $dbh->prepare("
> 	INSERT INTO table (col1, col2, col3)
> 	VALUES (123, ?, ?)
> ");
> my $twig = XML::Twig->new(
>    twig_handlers => { PIT => sub {
>       my ($t, $product) = @_;
>       my $descricao = $product->first_child('pitName')->att('name');
>       my $preco = $product->first_child('pitPrice')->att('price');
>       $sth->bind_param(1, $descricao);
>       $sth->bind_param(2, $preco);
>       $sth->execute();
>       $sth->finish();
>       $t->purge;
>    }}
> );
> $twig->parseurl('file:///home/joenio/data/produtos.xml');
> $twig->purge;
> $dbh->disconnect();
>
> -----
>
> Alguem já enfrentou situação parecida?

   Quando eu tive este erro, tinha fork() explícito envolvido.
   Mas faz muito tempo e muitas versões do DBI atrás.
   Talvez isso já não seja mais a causa do seu problema.
   Tente por favor conseguir mais informação sobre este processo  
"extra" que você mencionou.
   Putamplexos!

--
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}




Mais detalhes sobre a lista de discussão Cascavel-pm