TCC - Comparativo de ORMs e Acesso Nativo

Preview:

DESCRIPTION

TCC meu e do Jean Baldessar apresentado na UNISUL em 2011.

Citation preview

Israel Fonseca

Jean Baldessar

Comparativo das Vantagens e Desvantages do Uso de Ferramentas para Mapeamento Objeto

Relacional

Introdução

Banco de Dados Relacionais

Há quem diga que o conceito por trás dele foi a última grande invenção da história da computação.

Gavin King

Introdução

Programação Orientada a Objetos

Melhor tempo de resposta ao mercado;

Aumento da qualidade;

Maior versatilidade a mudanças;

Facilidade para reuso de código.

Grady Booch

Disparidade objeto relacional

E agora?

OODBs Nicho

reduzido

Mas e agora?

E outros...

ORM

Mapeamento Objeto Relacional Ponte Manutenabilidade Independência de banco de dados Utilização de bancos legados Popularidade

Solução definitiva?

Polêmica

Ted Neward

ORM = Vietnã

Simon Sabin

DBAs reclamam

Objetivo Geral

Fazer uma análise de funcionalidades, suporte, desempenho e produtividade nas ferramentas para

ORM em relação ao acesso direto à base da dados, e com isso fornecer um conhecimento útil para que arquitetos de software escolham a tecnologia mais

adequada aos seus projetos.

Objetivos Específicos

Criar uma metodologia para avaliação; Verificar funcionalidades de mapeamento; Verificar recursos de gerenciamento transacional

e acesso a procedures e functions; Verificar recursos de acesso direto a base de

dados; Pesquisar suporte oferecido, tanto pelos seus

fornecedores quanto pela comunidade; Analisar o desempenho e produtividade em

operações de acesso à base de dados.

Justificativa

Opiniões divididas Escolha mais consciente sobre que tecnologia

deve-se usar para cada projeto;

Desenvolvimento

Método de Avaliação

FuncionalidadesSuporte

DesempenhoProdutividade

Modelo Fictício

Simplicidade (Didático) Contemplar vários cenários para o mapeamento

Funcionalidades

Hibernate

Procedures e Functions

SQLAlchemy DataMapperUm-Para-Um suporta suporta suportaUm-Para-Muitos suporta suporta suportaMuitos-Para-Um suporta suporta suportaMuitos-Para-Muitos suporta suporta suporta parcialmenteChave Composta suporta suporta suportaHerança Single Table suporta suporta suportaHerança Joined Table suporta suporta parcialmente não suportaHerança Table Per Class suporta suporta não suportaDuas Tabelas para Um Objeto suporta não suporta não suportaDois Objetos para uma Tabela suporta suporta não suportaAgregações suporta suporta suportaAgrupamentos suporta suporta não suportaControle de Carregamento de Relacionamento suporta suporta suporta parcialmenteTransações suporta suporta suporta

suporta suporta suporta

SQLAlchemy

Herança: Alterações no modelo foram necessárias

DataMapper

Muitos-Para-Muitos: Padrão de nomenclatura

Controle Carregamento: Abordagem gulosa

Funcionalidades

DataMapper limitado Limitações contornáveis com modificações no

modelo e acesso direto Herança pode ser mapeada para um muitos-para-

um Duas tabelas para um objeto pode ser mapeado

com dois objetos Uma tabela para dois objetos pode ser mapeado

para um objeto Quanto mais completo, menor a preocupação com

as disparidades

Suporte

Livros

Amazon Hibernate: mais de 15 livros SQLAlchemy: 2 livros DataMapper: nenhum livro

Gavin King Michael Bayer

Documentação Oficial

Páginas Hibernate: 393 SQLAlchemy: 340 DataMapper: aproximadamente 30

PDF/HTML DataMapper não aborda assuntos importantes

como o uso de transações

Comunidade SQLAlchemy (Google Groups)

Usuários: 2587 Média de postagens por dia: 5

DataMapper (Google Groups)

Usuários: 984 Média de postagens por dia: 5

Hibernate (Fórum próprio)

Usuários: 62156 Média de postagens por dia

2003: 63 Último mês: 15

Perguntas respondidas

Hibernate: 0/4 SQLAlchemy: 5/5 DataMapper: 9/12

Michael Bayer Dan Kubb

Suporte

Bibliografia Hibernate famoso

Documentação DataMapper limitado

Comunidade Contradição Hibernate

Em geral, o suporte é bom

Desempenho

Desempenho

DAO (Direto e com ORM) Base de testes Automação

Tempo Tráfego Relatórios

Código fonte: http://code.google.com/p/orm-native-comparative/

Tempo Desconsiderando Tráfego

Operação Linguagem Direto ORMAtualização java 34,505 34,413

34,354 34,414

33,966 34,795Inserção java 34,112 34,166

34,114 34,150

34,313 34,527Listagem java 0,256 1,213

0,114 0,614

0,096 0,409Remoção java 34,318 34,669

34,359 34,660

34,374 35,058

python

ruby

python

ruby

python

ruby

python

ruby

1% de diferença geral

Listagem

Java: 4,7

Python: 5,3

DataMapper: 4,2

Cerca de 1 segundo

Operação Linguagem Direto ORMAgrupamento java 0,200 0,769

0,120 0,2700,108 x

Guloso java 0,361 2,3630,539 1,1480,383 x

java 0,031 0,3580,018 0,0410,016 0,038

java 1,946 1,9681,933 1,9611,956 x

python

ruby

python

rubyJoin

pythonruby

Subconsulta

pythonruby

Subconsultas com tempo estável

Tráfego de Rede

Operação LinguagemDireto ORM

enviado recebido enviado recebido

Atualização java 14736320 4960768 22536528 17434560

15071000 6298880 14640528 6307008

14277864 6079392 13224528 6085728

Inserção java 14088528 5015232 15023088 5069568

14856528 6349728 14880528 7568448

13968528 6130560 13800528 7353504

Listagem java 30088 6727304 25424 6751704

29520 6727832 27920 6728760

20072 6727096 31944 6727096

Remoção java 6864320 4954432 18840528 19859616

7583528 6302048 7728528 6305952

6525864 6084672 6528528 6098928

python

ruby

pythonruby

pythonruby

pythonruby

SQLAlchemy e DataMapper

Inserção: 5%

Demais: 1%

Hibernate

Atualização: 200%

Remoção: 300%

Demais: 1%

Operação LinguagemDireto ORM

enviado recebido enviado recebido

java 10784 216128 24264 215960

11800 215880 14016 216856

12240 215880 x x

Guloso java 29712 5728152 42744 6838416

32392 5615272 32656 6036696

30312 4871480 x x

java 10552 217720 21712 218080

12928 217472 12768 219136

12016 217472 18544 225792

Agrupamento java 14552 2182920 17592 2284760

14296 2188688 13896 2188904

17520 2187952 x x

Subconsulta

python

ruby

pythonruby

Join

pythonruby

pythonruby

Média de 7% Fator 'alias'

Tempo Considerando Tráfego

Simulação

tempo execução total = tempo execução local + tráfego envio / velocidade de envio + tráfego de retorno / velocidade de

retorno

Rede 1: 100MBits/sRede 2: 500KBits/s 250KBits/s

Operação Linguagem Direto ORM

Atualização java 34,702 34,812

34,567 34,623

34,169 34,989

Inserção java 34,303 34,367

34,326 34,374

34,514 34,739

Listagem java 0,324 1,280

0,181 0,681

0,163 0,476

Remoção java 34,437 35,056

34,498 34,801

34,501 35,184

python

ruby

python

ruby

python

ruby

python

ruby

100MBits/s Tráfego irrelevante

Operação Linguagem Direto ORM

Agrupamento java 0,221 0,792

0,142 0,292

0,130 x

Guloso java 0,418 2,432

0,596 1,209

0,432 x

java 0,033 0,360

0,021 0,044

0,019 0,041

java 1,949 1,970

1,935 1,963

1,959 x

python

ruby

python

ruby

Join

python

ruby

Subconsulta

python

ruby

100MBits/s Tráfego irrelevante

Operação Linguagem Direto ORMAtualização java 83,821 149,224

89,691 88,923

86,839 85,587Inserção java 82,350 84,491

89,226 94,185

86,773 91,542Listagem java 27,225 28,270

27,084 27,585

27,044 27,381Remoção java 67,865 151,788

74,734 75,341

71,765 72,511

python

ruby

python

ruby

python

ruby

python

ruby

500KBits/s 250KBits/s ORM Direto≃

Operação Linguagem Direto ORM

Agrupamento java 8,960 9,943

8,903 9,053

8,895 xGuloso java 23,333 29,802

23,065 25,360

19,929 x

java 0,923 1,273

0,914 0,943

0,910 0,979

java 2,832 2,880

2,820 2,857

2,844 x

python

ruby

python

ruby

Join

python

ruby

Subconsulta

python

ruby

500KBits/s 250KBits/s ORM Direto≃

Evolução do Desempenho em Relação à Quantidade de Registros

Rede 1: 100MBits/sRede 2: 500KBits/s 250KBits/s

Produtividade

Operação Linguagem Direto ORMAgrupamento java 936 249

462 122

531 x

Atualização java 511 138

237 78

225 37Guloso java 3164 245

1664 230

1447 xInserção java 467 140

222 78

211 37

java 956 216

467 174

541 115Listagem java 689 131

295 90

356 32Remoção java 308 170

132 81

127 40

java 994 409

python

ruby

python

ruby

python

ruby

python

ruby

Join

python

ruby

python

ruby

python

ruby

Subconsulta

Até: 1099,65% Média: 360% Fatores Extras

Conclusão

Conclusões

Funcionalidades DataMapper limitado, porém, contornável

Suporte Livros, Documentação e Comunidades

oferecem bom suporte ao aprendizado

Conclusões

Desempenho Tempo s/ tráfego: mais devagar, mas muito rápido Tempo c/ tráfego: praticamente igual Aumento do volume de dados: crescimento

proporcional Produtividade

Quantidade de Caracteres diminuiu drásticamente Fatores Extras (Independência de Banco,

Manutenabilidade)

Conclusão

Quando não usar Otimização extrema Projeto pequeno Despreparo + falta de tempo

Vantagem para a grande maioria Cabe ao arquiteto tomar a decisão final baseado

nas características do seu projeto

Trabalhos futuros Disponibilizar os relatórios na web de forma amigável, com um

site que permita a consulta dos dados obtidos.

Expandir o número de ferramentas e linguagens testadas.

Expandir o número de testes para abranger situações mais específicas.

Testar vários bancos de dados para avaliar a portabilidade das ferramentas.

Documentar e disponibilizar o código fonte dos testes e ferramentas utilizadas para que outros desenvolvedores possam testar outras ferramentas, ou outras versões das ferramentas já testadas.

Permitir a participação de terceiros no processo de melhoria e expansão dos testes.

Recommended