[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