JPA_ Comparando Persistência de Dados com JPA TOPLINK E HIBERNATE TESTADOS EM DIFERENTES BANCOS DE DADOS E SISTEMAS OPERACIONAIS. Este artigo descreve os testes com diversas combinações de frameworks, banco de dados e sistemas operacionais analisando qual ! "#$% &! '(! ()($*(+, ! -#! -#.#"/#'% ! ' ! 01#! -*2! &#./#*3 ! 4! /#&sistência de dados em suas versões padrão, sem qualquer tunning. Abordaremos MySQL, PostgreSql, Oracle, SQL Server, Windows, Ubuntu, Toplink e Hibernate. persistência é uma das áreas de maior importân!"# $%# &%"# "'(! ")*+# ,--# .Java Enterprise Edition/0# 1$23+# $1'$ !4 "3"# '$("# ,56# .,"7"# 5$81!19$2 $# 65:/0# ;&$# +8!<!2"(%$29$# =">!"# '"89$# 3"# '("9"=+8%"# -,?# .Enterprise Java Beans/@#6# '"89!8# 3"# 7$81*+# A# 3+# ,"7"#"#,56#'"11+&#"#9$8#"#1&"#'8B'8!"#$1'$ !4 ")*+0# ,56#C@D@ Com o uso de frameworks para persistência o de1$27+(7$3+8#+E9F%#&%#2G7$(#%"!1#"(9+#3$#"E198")*+# 1+E8$#+#98"3! !+2"(#,H?I0#'$8%!9!23+#&9!(!>"8#+#%$"2!1%+#3$#JKL#.Object to Relational Management/# $%#1&"#"'(! ")*+0#3!%!2&!23+#+#" +'("%$29+#3"#9$ 2+(+<!"#3+#MN?H#.M!19$%"#N$8$2 !"3+8#3$#?"2 +#3$# H"3+1/#"+# B3!<+#+8!$29"3+#"#+EO$9+1@ J# " +'("%$29+# 8$3&>!3+# "%'(!"# "# '+11!E!(!3"3$#3$#1$($)*+#3$#9$ 2+(+<!"#2"# "%"3"# P"%"3"#3$# -:M# .-29$8'8!1$# :2=+8%"9!+2# MQ19$%/# ;&$0# 1$<&23+# "# 3+ &%$29")*+# ,--# R0# '$8%!9$# "# !29$<8")*+# $298$# 3!=$8$29$1#'("9"=+8%"1#$#%$ "2!1%+1#3$#"8%">$2"mento de dados. Para este trabalho, as tecnologias 1$($ !+2"3"1# =+8"%# LQMST0# 5+19<8$M;(0# J8" ($# $# SQLServer. U$19$#"89!<+0#1$8*+#3$%+2198"3+1#+1#8$1&(9"3+1# relacionados ao desempenho entre dois frameworks E"1$"3+1#$%#,56V#W!E$82"9$#$#X+'T!2Y@#Z+8"%#"2"- A / 54 (!1"3"1#3!=$8$29$1# +%E!2")[$1#3+1#=8"%$\+8Y1# +%# +1# 1!19$%"1# +'$8" !+2"!1# ]!23+\1# ^DD_# M$87$8# $# T!2&`# aE&29&# CC@Db0# O&29+# "+1# E"2 +1# 3$# 3"3+1# !tados. Os sistemas operacionais foram selecionados buscando abranger o mercado brasileiro de softwa8$1#(! $2 !"3+1#$#+')[$1#3$#1+=9\"8$1#(!78$1#%"!1#'+pulares. Persistência de dados 6#'$81!19c2 !"#3$#3"3+1#2+1#'+11!E!(!9"#98"E"(P"8# +%# +# JKL0# ;&$# '$8%!9$# "# 8!")*+# 3$# ("11$1# ,"7"# como beans de entidade, mapeando-as para tabelas $%# &%# E"2 +# 3$# 3"3+1# 8$(" !+2"(@# a%"# 3"1# 7"29"<$21# 3+# &1+# 3"# ,56# F# "# 2*+# +E8!<"9+8!$3"3$# 3+# &1+# 3$# !2198&)[$1# MST0# +# ;&$# "&%$29"# "# 7$(+ !3"3$# 3$# desenvolvimento do software e não restringe as ins98&)[$1#3$#'$81!19c2 !"#"#&%#'"38*+#+&#7$81*+#$1'$G4 "#3$#MST@# 6# 8!")*+#3"1#!2198&)[$1#MST#F#3$#8$1'+21"E!(!3"3$#3+#=8"%$\+8Y#'8+7$3+8#3$#,56#1$23+#&9!(!>"3+# 2"# "%"3"#3$#'$81!19c2 !"@#H$19"#=+8%"0#&%#1+=9\"8$#;&$#&9!(!>"#,56#9+82"d1$#2*+#3$'$23$29$#3"1#'"8ticularidades da linguagem SQL própria do banco de 3"3+10#+#;&$#F#%&!9+#e9!(0#&%"#7$>#;&$#+#3$1$27+(7$dor não precisa reescrever todo o código adaptando- !"#$%&'()*%+&,-+$%)&.&/*()*%+0)123($"45%3 5!6 &"(- !#"!7'8#'%(&*(!#!9*:';*(!-(!9 "/13(+, <!"#.3&#!#!- 13 &!#"!=>.*;(!9 "/13(;* '($!/#$ !?=@9AB@CD!E#($*2(!3&(F($% .! ; " !; '.1$3 &!G()(!' !*'3#&* &!- !7.3(- !-#!@, !C(1$ D!C ..1*!;#&3*H;(+, !@9GC<!5!- ;#'3#!'(!B'*)#&.*-(-#!- !7.3(- !-#!I*'(.! J#&(*.!KB7IJL!#!'(!=MN79!-#!@, !G .5!- !E* !C&#3 D!G1'3 !; "! 13& .!; $(F &(- &#.!"('35"! !.*3#!%33/OAAPPPD/(33#&'*2('- D; "D br para a discussão de desenvolvimento de software. 6()5%/&789)%&:%38/&9(& $"#(&.&3()5%/13()5;89)%45%3 atualmente é graduando em Sistemas de Informação pela Universidade do Estado de Minas Gerais (UEMG) entusiasta da linguagem Java e empresário. -o para outro banco de dados, aumentando a compatibilidade e portabilidade do software, desfrutando 3"#%"2!'&(")*+#E"1$"3"#$%#+EO$9+1@ O Hibernate L"29!3+#'$("#,?+110#=+!# 8!"3+#$%#^DDC#'+8#N"vin King e é um framework livre e de código aberto (! $2 !"3+#1+E#"#TN5T#7^@C0#1$<&$#+#'"38*+#,56#$#3!1'+2!E!(!>"#&%"#7$81*+#'"8"#"#9$ 2+(+<!"#@U$9@ 69&"(%$29$#$19f#$%#1&"#7$81*+#_@R@R#.$19f7$(/#$# +29F%#&%"#7"19"#3+ &%$29")*+#3!1'+2G7$(#2+#1!9$# na mantenedora. O TopLink Criado pela Oracle, teve sua primeira distribui)*+#2+#!2G !+#3"#3F "3"#3$#gD#$#F#&%#=8"%$\+8Y#'8+'8!$9f8!+0#9"%EF%#1$<&$#+#'"38*+#,56#$#"9&"(%$29$# está na versão 11g. Ambiente de simulação X+3+1#+1#9$19$1#=+8"%#$`$ &9"3+1#$%#2+9$E++Y# M+2Q#h"!+# +%#'8+ $11"3+8#I+8$#^#H&+#^@DNW># +%# bN?#3$#%$%B8!"#K6L@ J# 1+=9\"8$# &9!(!>"3+# '"8"# +1# 9$19$1# +298+("7"# +# 9$%'+# 3$# "3"# 9"8$="# '"8"# '+19$8!+8# +%'"8")*+0# considerando ainda a possibilidade de testar em di=$8$29$1#M!19$%"1#J'$8" !+2"!1@#6(F%#3!11+0#$%#9+3+1#+1# "1+10#"#%$1%"#%f;&!2"#7!89&"(#=+!#&9!(!>"3"0# 2$19$# "1+#"#,hL#C@R@ <$2-)(&=4 Diagrama do Banco de Dados dos Testes. J#!29&!9+#3$19$#"89!<+#2*+#F#3$42!8#;&"(#F#"#%$lhor das tecnologias, mas sim, analisar apenas o seu 3$1$%'$2P+# 1$%# 2$2P&%"# '$81+2"(!>")*+# $%# 1&"# +24<&8")*+0# '8$1$87"23+d"# +%+# =+!# ("2)"3"# "+# %$8 "3+@#M"E$d1$#;&$# +%#+#&1+#3$#'$81+2"(!>")[$1# $# +24<&8")[$1#"'8!%+8"3"1#.9&22!2</0#"11!%# +%+# o uso de pools de conexão, o resultado pode ser diferente do encontrado neste artigo. Z+8"%#&9!(!>"3"1#"1#1$<&!29$1#9$ 2+(+<!"1V 58+3&9+1#$#7$81[$1 » Frameworks persistência: W!E$82"9$#7$81*+#_@^@A0# +%'"9G7$(# +%#,56#C@D X+'T!2Y#7$81*+#^@C#E&!(3#_0# +%'"9G7$(# +%#,56#C@D » Bancos de dados: LQM;(#7$81*+#A@C@CC 5+19<8$M;(#7$81*+#i@b@b J8" ($#7$81*+#CD<#-`'8$11#-3!9!+2#j#CD@^@D M;(M$87$8#^DDA#7$81*+#g@DD@bDA_@DD#-`'8$11 » Sistemas operacionais: ]!23+\1#^DD_#M$87! $#5" Y#^ T!2&`#aE&29&#CC@Db0#Y$82$(#^@R@_Ad^b » Java: Lf;&!2"#7!89&"(#,"7"#7$81*+#C@R@Dk^^ 5"8"#"#1!%&(")*+#3$#&%# $2f8!+#3$#1+=9\"8$#8$"(0# =+!# 8!"3"# &%"# $198&9&8"# +%# CD# $29!3"3$1# 8$(" !+nadas. Cada entidade apresentava atributos de tipos variados, porém presentes em todos os sistemas gerenciadores de bancos de dados testados. J1# 9!'+1# 3$# 3"3+1# =+8"%# :UX0# H6X-0# X-lX# $# ZTJ6X0# +%+#%+198"#"#4<&8"#C@#J&98"# "8" 9$8G19! "# &9!(!>"3"#'"8"#1!%&("8#1!9&")[$1#8$"!1#=+!#+#8$(" !+2"%$29+#$298$#"1#$29!3"3$10#$%#;&$#=+8"%#&9!(!>"3+1# relacionamentos diversos, com cenários de persis9c2 !"#$%# "1 "9"#$#$`'+89")*+#3$# P"7$1#$198"2<$!8"1#;&$#$`!<$%#"#<$8")*+#3$#1!29"`$1#%"!1# +%'($`"1#'$(+#=8"%$\+8Y#,56@ Os dados foram gerados aleatoriamente pelo sistema, respeitando o tipo de dado de cada atributo e &9!(!>"23+# +# (!%!9$# %f`!%+# 3$# !2=+8%")*+# 3$# "3"# tipo de dado. 6# T!19"<$%# C# "'8$1$29"# &%# $`$%'(+# 3$# $29!3"3$# %"'$"3"# '"8"# '+19$8!+8# %"2!'&(")*+# '$(+1# frameworks. Considerando que os frameworks são 1$($ !+2"3+1# '$("# +24<&8")*+# 2+# '$81!19$2 $@`%(0# 55 \ '"8"# "3"#+')*+#F# 8!"3"#&%"#2+7"#&2!3"3$#3$#'$81!19c2 !"#.5$81!19$2 $#a2!9/0#+#;&$#'$8%!9$#+#%$1%+# mapeamento para qualquer framework que segue o '"38*+# ,560# +%# %G2!%"1# %+3!4 ")[$1# "'$2"1# 2+# persistence.xml. >$/?(283&=4 Implementação da entidade Table3. @Entity @Table(name = “table3”) public class Table3 implements Serializable { @Id @SequenceGenerator(name = “seq_table3”, sequenceName = “seq_table3”, allocationSize = 1) @GeneratedValue(generator = “seq_table3”, strategy=GenerationType.AUTO) @Column(name = “idtable3”) private int idTable3; média independentemente de banco de dados e siste%"#+'$8" !+2"(@#6+#9+9"(#=+8"%#%"2!'&("3+1#miC@^DD# registros para cada teste. A(*8"(&=4 Tempo total da comparação entre TopLink e Hibernate. Framework Tempo Total Médio W!E$82"9$ X+'T!2Y DPbi%bR1 CP^g%Ci1 I+%'"8"23+# +1# 3+!1# =8"%$\+8Y10# +# W!E$82"9$# obteve o melhor desempenho, mostrando-se ser mais 8f'!3+0# 8$"(!>"23+# 9+3"1# "1# +'$8")[$1# $%# %$2+1# 3$# &%"#P+8"# +%+#3$%+2198"3+#'$(+#<8f4 +#3"#4<&8"#^@ Desempenho entre sistemas operacionais U$19"1#1!%&(")[$1#=+8"%#$`$ &9"3+1#gR#9$19$1#$%# "3"#1!19$%"#+'$8" !+2"(0#3$1'8$>"23+#+#MST#M$87$8# no ambiente Windows, para que a quantidade de si%&(")[$1#=+11$#$;&!7"($29$0#Of#;&$#$($#2*+#F# +%'"9G7$(#$%#"%E!$29$#T!2&`@#U"#9"E$("#^#1*+#"'8$1$29"3+1# os resultados obtidos, que corresponde à média entre os dois frameworks no respectivo sistema operacio2"(#&9!(!>"23+#9+3+1#+1#E"2 +1#9$19"3+10# +%#$` $)*+# 3+#MST#M$87$8@#6#;&"29!3"3$#3$#8$<!198+1#%"2!'&("3+1#=+!#3$#RRg@gDD@ @Column(name = “valor1”) private int valor1; @Column(name = “valor2”) private @%(? valor2; @Column(name = “texto”, length=1000) private String texto; @ManyToOne @ForeignKey(name=”fk_table3_table2”) @JoinColumn(name = “idtable2”, referencedColumnName = “idtable2”, nullable = false) private Table2 table2; A(*8"(&B4 Tempo total da comparação entre sistemas operacionais. Sistema Operacional Linux Windows // Gets e Sets Tempo Total Médio DPbg%bC1 CPDi%bA1 } U$19"# +%'"8")*+0# +%+# $`!E!3+# 2"# 4<&8"# _0# +# sistema operacional Linux obteve tempo menor, em Desempenho entre Hibernate e TopLink ;&$#"+#42"(#3$#9+3"1#"1#+'$8")[$1#+#9$%'+#=+!#!2=$8!+8# Z+8"%#$`$ &9"3+1#CC^#9$19$1#$%# "3"#=8"%$\+8Y# à uma hora. nos dois sistemas operacionais, quatro bancos de da3+1#7"8!"23+#$298$#C0#^0#_#$#b#9"E$("1#.%+198"3"1#2"# Desempenho entre banco de dados U$19"1# 1!%&(")[$10# =+8"%# $`$ &9"3"1# _^# +'$8"4<&8"# C/# $%# "3"# E"2 +# 3$# 3"3+1# . +%# $` $)*+# 3+# MST#M$87$8#2+#aE&29&/0#$#9+3+#+#9$%'+#<"19+#=+!#1+- )[$1#'"8"# "3"#E"2 +#3$#3"3+10#1$23+#$("1V#!21$8)*+0# %"3+#$#+#8$1&(9"3+#$19f#$`!E!3+#2"#4<&8"#^@#6#9"E$("# 1$($)*+0# "9&"(!>")*+# $# $` (&1*+# 3$# 3"3+10# 7"8!"23+# 1 mostra o resultado de tempo total em horas, que é a $298$# C0# ^0# _0# b# 9"E$("1@# J1# 8$1&(9"3+1# 3+1# 9$19$1# $%# Tempo gasto entre frameworks Tempo gasto entre sistemas operacionais b0A X$%'+# b X$%'+# R .$%#%!(P[$1#3$#_0A %!(!11$<&23+1/ _ .$%#%!(P[$1#3$# A %!(!11$<&23+1/ b W!E$82"9$ X+'T!2Y _ ^ 1 D ^0A ^ C0A 1 D0A D Linux Windows Frameworks <$2-)(&B4!J&QH; !-#!; "/(&(+, !#'3&#!6&("#P &R.D! / 56 <$2-)(&C4!J&QH; !-#!; "/(&(+, !#'3&#!.*.3#"(.! /#&(;* '(*.D referências/ !"#$%&'!($)#*!+&$,-./$01'!(#//$-)2!345!6!7/0899$0,.1:!4.;.! 7#/9$9%#,-#!<7=2!>$0!?#!4.,#$/0:!(0?#/,.'!@AAB > Burke, Bill; Monson-Haefel, Richard, Enterprise !"!#$!%&'()*+',-.'/!01.+'2**3 > Bauer, Christian; King, Gaving, Hibernate in Action, 4!%%5%6+'2**7 8'9.:0;$%<!=-.'>?:5!1'@5A$B%!<$+'C5&D.%E"$1'$;'FGGG) H5A$B%!<$).B68'I:$&&!C.'$;'J2'C$'K01H.'C$'2*JJ 8'9.:0;$%<!=-.'.?:5!1'L.DM5%N+'C5&D.%E"$1'$;'FH<<DOPP www.oracle.com/technetwork/middleware/toplink / ."$B"5$GP5%C$Q)H<;18'I:$&&!C.'$;'JR'C$'K01H.'C$'2*JJ' A(*8"(&D4 Resultados em ambiente Linux. Banco de dados Tempo total médio PostgreSQL Oracle LQM;( DPC_%_A1 DPC_%bA1 DP^^%^C1 Em ambiente Windows, o SQL Server mostroud1$#1$8#%"!1#8f'!3+#'$8"29$#+1#+&98+1@#U$19$# "1+0#+1# dois bancos de dados proprietários levaram menos 9$%'+#$%#8$(")*+#n1#+')[$1#<8"9&!9"1@#U+#"%E!$29$# Linux, coincidentemente, quem levou a melhor foi o PostgreSQL, que é gratuito e de código-fonte aberto. U+1#3+!1#1!19$%"1#+'$8" !+2"!10#+#LQM;(#=+!#"#+')*+# %"!1# ($29"0# +%# 8$1&(9"3+1# 1&'$8!+8$1# "# ^D# %!2&9+1# em ambos os testes. Conclusão – Comparativo framework, banco de dados e sistema operacional "%E!$29$# ]!23+\1# $19*+# 3!1'+2G7$!1# 2"# 9"E$("# _@# 6'B1# +1# 9$19$10# '+3$%+1# +2 (&!8# ;&$# $`!19!8"%# 6# ;&"29!3"3$# 3$# 8$<!198+1# %"2!'&("3+1# =+!# "# %$1- +%E!2")[$1#+9!%!>"3"10#1$23+#;&$#+#W!E$82"9$#+Ema dos testes anteriores com a quantidade total de 9$7$#"1# !2 +#'8!%$!8"1# +(+ ")[$1#$%#3$1$%'$2P+0# miC@^DD#8$<!198+1#'+8#+'$8")*+@ 1$23+#1$<&!3+#'$(+#X+'T!2Y#$%#"%E!$29$#T!2&`@ H$11"# =+8%"0# +2 (&!d1$# ;&$# "# +%E!2")*+# 3$# A(*8"(&C4 Comparação de resultados entre bancos de 9$ 2+(+<!"1# +%# +24<&8")[$1# '"38+2!>"3"10# 1$%# dados no Windows. ;&"(;&$8# &19+%!>")*+0#$%#&%# $2f8!+#;&$#"'8$1$2Banco de dados Tempo total médio ta diversas entidades e diferentes tipos de relacionaSQL Server DPCg%_m1 %$29+#'"8"#'$81!19c2 !"# +%#,56#F#+#W!E$82"9$# +%+# Oracle DP^D%CR1 '8+7$3+8#3$#,56#$%#"%E!$29$#T!2&`0# +%#&%#E"2 +# de dados PostgreSql, seguido muito próximo pelo PostgreSQL DP^C%A^1 E"2 +#3$#3"3+1#J8" ($@#,f#"# +%E!2")*+#%$2+1#7$(+># LQM;( DP^R%_R1 =+!#X+'T!2Y#$%#"%E!$29$#]!23+\10#&9!(!>"23+#"#E"1$# Em ambiente Linux, obviamente, não foi consi<8"9&!9"#LQMST@# 3$8"3+#+#E"2 +#3$#3"3+1#3"#L! 8+1+=9@#J1#8$1&(9"3+1# mostraram-se próximos, expressando uma pequena E%+/$98)(FG8/&H+($/ vantagem do PostgreSql. Resultados como os descritos neste artigo mostram que, além das possibilidades de softwares proprietários !"#$!%&' Tempo médio, considerando framework de persistência, OS e banco de dados. poderosos e con4f7$!10# "1# +')[$1# Tempo médio por Sistema Ranking Framework operacional Banco de dados operação gratuitas tam1 !"#$%&'#( Linux PostgreSQL )*+),-.+*, bém devem ser consideradas. + !"#$%&'# Linux Oracle )*+),-/-*, J&98"# "48%")*+# . !"#$%&'# Windows SQL Server )*++,001*, que pode ser fei/ !"#$%&'# Windows Oracle )*++,-.-*, 9"#F#;&$#1+(&)[$1# 2 !"#$%&'# Windows PostgreSQL )*+.,.1)*, gratuitas em am3456!%7 Linux PostgreSQL )*.),.+/*, bientes proprie8 3456!%7 Linux Oracle )*.),1+-*, tários obtiveram 8 !"#$%&'# Windows 9:;<= )*.2,-01*, os piores resulta1 !"#$%&'# Linux 9:;<= )*.8,>/)*, 3+1@# U+# $29"29+0# 0) 3456!%7 Linux 9:;<= )*/2,110*, o SQL Server, em 11 3456!%7 Windows SQL Server )*20,2)0*, ambiente Windo0+ 3456!%7 Windows Oracle )*2.,/00*, ws, mostrou-se competitivo às 0. 3456!%7 Windows PostgreSQL )*2>,-+/*, 1+(&)[$1# <8"9&!0/ 3456!%7 Windows 9:;<= 0*)/,022*, tas. 57 \