A corrida Oracle:procedure,Java stored proc,JDBC Thin e OCI,quem ganha?

  • 0

A corrida Oracle:procedure,Java stored proc,JDBC Thin e OCI,quem ganha?

Category : banco de dados , Java

2 Flares Twitter 0 Facebook 2 Filament.io 2 Flares ×

Nesse artigo vou fazer um comparativo das opções de implementação com Oracle e Java, usando uma rotina que vai ler umas tabelas para buscar o CEP e depois fazer a carga em outra.


As opções que temos:

– Antes de existir Java: a velha e boa stored procedure em PL/SQL … é um código pré-compilado em p-code que fica armazenado dentro do banco de dados… acesso local e nativo aos dados.

– Java client com driver JDBC Thin – acesso remoto aos dados.

– Java client com driver OCI Thin – acesso remoto e nativo aos dados.

– Java em stored procedure – desde o Oracle 8i temos uma engine em Java dentro do banco, o que nos possibilita executar rotinas em Java dentro do banco, com acesso local e nativo aos dados.

É impressionante a quantidade de profissionais Java que trabalha há anos com Oracle não conhece metade das opções existentes.

A implementação mais usada é a JDBC Thin, pois é a mais fácil de configurar, mas de acordo com a Oracle é a mais lenta de todas.

O Oracle OCI (Oracle Call Interface) é a maneira nativa que os clients utilizam para se conectar ao banco de dados, essa maneira nativa pode ser feita em várias linguagens (C, Cobol , Java) utilizando as bibliotecas do Oracle Client para acessar o banco de dados. Isso significa que para usar OCI, a instalação do Oracle client é obrigatória.

Ferramentas como Oracle SQL*Plus, PL/SQL Developer são rápidas porque usam OCI para acessar o banco de dados.

A configuração adequada do OCI pode ser complicada a primeira vez, e somente nesse fórum russo eu encontrei um simples resumo que explica como configurar o seu ambiente para usar OCI (depois de instalado o Oracle Client):

Em plataforma Windows:


– Adicione [ORACLE_HOME] \ jdbc \ lib \ ojdbc5.jar ao CLASSPATH para JDK 1.5 ou
[ORACLE_HOME] \ jdbc \ lib \ ojdbc6.jar para JDK 1.6.
– Adicione [ORACLE_HOME] \ jlib \ orai18n.jar ao CLASSPATH.
– Adicione [ORACLE_HOME] \ bin ao PATH (que fica nas variáveis de ambiente, nas configurações avançadas do Sistema)

Em plataforma Unix:

– Adicione [ORACLE_HOME] / jdbc / lib / ojdbc5.jar ao CLASSPATH para JDK 1.5 ou
[ORACLE_HOME] / jdbc / lib / ojdbc6.jar para JDK 1.6.
– Adicione [ORACLE_HOME] / jlib / orai18n.jar ao CLASSPATH.
– Adicione [ORACLE_HOME] / jdbc / lib ao LD_LIBRARY_PATH

Para trabalhar com Oracle Stored Procedures, você precisa primeiro ter uma ferramenta como Eclipse para desenvolver suas rotinas, e depois gerar suas classes com compatibilidade para JDK 1.5 (se for Oracle 11i) e JDK 1.4 (se for Oracle 10g).

Além disso, a opção de Java deve estar ativa no banco de dados, verifique com o SQL:

Essa opção Java não está disponível no Oracle Express Edition, é preciso instalar uma versão Personal Oracle, Standard ou Enterprise Edition.

Para carregar as classes em Java no banco é utilizado o loadjava, como por exemplo para carregar a nossa classe para o teste da corrida:

E depois amarramos essa classe com uma procedure, dessa maneira:

Bom, vamos falar agora do processo de carga… temos o primeiro exemplo que é executado inteiramente em PL/SQL:

Depois temos o outro exemplo que será chamado por todas as outras classes Java:

Em ambos os casos temos o mesmo processo: buscar em uma View de todos os endereços do Brasil os que contém “paulo” no nome da cidade e armazenar em uma tabela separada.

Temos 57789 de 699307 registros (8,25%) em cada execução da rotina.

O cálculo foi feito da diferença do primeiro e o último insert (o tempo de 57789 inserções na base).

O teste foi feito sem envolver rede, no próprio servidor para tirar essa dúvida da nossa corrida.

Em todos os quatro casos as rotinas foram executadas dez vezes, com a seguinte performance:

  1. Em primeiro lugar não é nenhuma surpresa que foi o PL/SQL, com tempo mínimo de 10 segundos, máximo de 12 e médio de 11.3
  2. Em segundo lugar, pertinho vieram as stored procedures em Java, com tempo mínimo de 23 segundos, máximo de 25 e médio de 23,9
  3. Em terceiro lugar, bem atrás vieram os drivers JDBC Thin, com tempo mínimo de 59 segundos, máximo de 79 e médio de 67
  4. Em último lugar vieram os drivers JDBC OCI, com tempo mínimo de 64 segundos, máximo de 95 e médio de 71,9

Vamos fazer algumas comparações com os tempos médios… a mesma rotina em PL/SQL roda 2 vezes mais rápido que uma stored procedure Java e 6 vezes mais rápido uma rotina de OCI, isso mesmo 6 vezes!

O interessante é que a Oracle recomenda usar o driver Thin para maior portabilidade e o driver OCI para melhor performance, mas nessa minha corrida e em outras literaturas dizem exatamente o oposto.

Quer testar você mesmo? Acesse o fonte do projeto e tire suas próprias conclusões!


About Author

Fernando Boaglio

???

Leave a Reply

Quero saber mais sobre…

Inscreva-se para receber as novidades!

Arquivos

2 Flares Twitter 0 Facebook 2 Filament.io 2 Flares ×