TCC - Comparativo de ORMs e Acesso Nativo
Post on 18-Dec-2014
84 Views
Preview:
DESCRIPTION
Transcript
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.
top related