tcc - comparativo de orms e acesso nativo

59
Israel Fonseca Jean Baldessar Comparativo das Vantagens e Desvantages do Uso de Ferramentas para Mapeamento Objeto Relacional

Upload: israel-ben-guilherme-fonseca

Post on 18-Dec-2014

93 views

Category:

Technology


2 download

DESCRIPTION

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

TRANSCRIPT

Page 1: TCC - Comparativo de ORMs e Acesso Nativo

Israel Fonseca

Jean Baldessar

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

Relacional

Page 2: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 3: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 4: TCC - Comparativo de ORMs e Acesso Nativo

Disparidade objeto relacional

Page 5: TCC - Comparativo de ORMs e Acesso Nativo
Page 6: TCC - Comparativo de ORMs e Acesso Nativo
Page 7: TCC - Comparativo de ORMs e Acesso Nativo
Page 8: TCC - Comparativo de ORMs e Acesso Nativo

E agora?

Page 9: TCC - Comparativo de ORMs e Acesso Nativo

OODBs Nicho

reduzido

Page 10: TCC - Comparativo de ORMs e Acesso Nativo

Mas e agora?

Page 11: TCC - Comparativo de ORMs e Acesso Nativo

E outros...

Page 12: TCC - Comparativo de ORMs e Acesso Nativo

ORM

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

Solução definitiva?

Page 13: TCC - Comparativo de ORMs e Acesso Nativo

Polêmica

Ted Neward

ORM = Vietnã

Simon Sabin

DBAs reclamam

Page 14: TCC - Comparativo de ORMs e Acesso Nativo

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.

Page 15: TCC - Comparativo de ORMs e Acesso Nativo

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.

Page 16: TCC - Comparativo de ORMs e Acesso Nativo

Justificativa

Opiniões divididas Escolha mais consciente sobre que tecnologia

deve-se usar para cada projeto;

Page 17: TCC - Comparativo de ORMs e Acesso Nativo
Page 18: TCC - Comparativo de ORMs e Acesso Nativo

Desenvolvimento

Page 19: TCC - Comparativo de ORMs e Acesso Nativo

Método de Avaliação

FuncionalidadesSuporte

DesempenhoProdutividade

Page 20: TCC - Comparativo de ORMs e Acesso Nativo

Modelo Fictício

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

Page 21: TCC - Comparativo de ORMs e Acesso Nativo
Page 22: TCC - Comparativo de ORMs e Acesso Nativo
Page 23: TCC - Comparativo de ORMs e Acesso Nativo
Page 24: TCC - Comparativo de ORMs e Acesso Nativo

Funcionalidades

Page 25: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 26: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 27: TCC - Comparativo de ORMs e Acesso Nativo

Suporte

Page 28: TCC - Comparativo de ORMs e Acesso Nativo
Page 29: TCC - Comparativo de ORMs e Acesso Nativo

Livros

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

Gavin King Michael Bayer

Page 30: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 31: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 32: TCC - Comparativo de ORMs e Acesso Nativo

Perguntas respondidas

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

Michael Bayer Dan Kubb

Page 33: TCC - Comparativo de ORMs e Acesso Nativo

Suporte

Bibliografia Hibernate famoso

Documentação DataMapper limitado

Comunidade Contradição Hibernate

Em geral, o suporte é bom

Page 34: TCC - Comparativo de ORMs e Acesso Nativo

Desempenho

Page 35: TCC - Comparativo de ORMs e Acesso Nativo

Desempenho

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

Tempo Tráfego Relatórios

Page 36: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 37: TCC - Comparativo de ORMs e Acesso Nativo

Tempo Desconsiderando Tráfego

Page 38: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 39: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 40: TCC - Comparativo de ORMs e Acesso Nativo

Tráfego de Rede

Page 41: TCC - Comparativo de ORMs e Acesso Nativo

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%

Page 42: TCC - Comparativo de ORMs e Acesso Nativo

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'

Page 43: TCC - Comparativo de ORMs e Acesso Nativo

Tempo Considerando Tráfego

Page 44: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 45: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 46: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 47: TCC - Comparativo de ORMs e Acesso Nativo

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≃

Page 48: TCC - Comparativo de ORMs e Acesso Nativo

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≃

Page 49: TCC - Comparativo de ORMs e Acesso Nativo

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

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

Page 50: TCC - Comparativo de ORMs e Acesso Nativo
Page 51: TCC - Comparativo de ORMs e Acesso Nativo
Page 52: TCC - Comparativo de ORMs e Acesso Nativo

Produtividade

Page 53: TCC - Comparativo de ORMs e Acesso Nativo
Page 54: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 55: TCC - Comparativo de ORMs e Acesso Nativo

Conclusão

Page 56: TCC - Comparativo de ORMs e Acesso Nativo

Conclusões

Funcionalidades DataMapper limitado, porém, contornável

Suporte Livros, Documentação e Comunidades

oferecem bom suporte ao aprendizado

Page 57: TCC - Comparativo de ORMs e Acesso Nativo

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)

Page 58: TCC - Comparativo de ORMs e Acesso Nativo

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

Page 59: TCC - Comparativo de ORMs e Acesso Nativo

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.