BENCHMARK DE FRAMEWORK MAPEAMENTO OBJETO-RELACIONAL (ORM) – UMA ANÁLISE UTILIZANDO JAVA PERSISTENCE API (JPA) FRAMEWORK’S BENCHMARK OBJECT-RELATIONAL MAPPING (ORM) - AN ANALYSIS USING JAVA PERSISTENCE API (JPA) Bárbara Ayako Nass Leonardo Henrique Marcon de Biagi Prof. Me Anderson Pazin – [email protected] RESUMO O armazenamento e gerenciamento de dados são atividades fundamentais para os sistemas de informação. Esses sistemas são apoiados, em sua grande maioria, por gerenciadores de banco de dados relacionais. Cada vez mais, tais sistemas são desenvolvidos utilizando-se dos conceitos e as linguagens orientadas a objetos. Nesse contexto há uma grande diferença semântica de funcionamento entre os conceitos de orientação a objetos, destinado ao desenvolvimento dos sistemas, e os conceitos de bases de dados relacionais, onde as aplicações desenvolvidas persistem os seus dados. Uma possível solução seria utilizar frameworks de persistência ORM que fazem o mapeamento entre os objetos e as relações. Este trabalho apresenta um estudo comparativo entre alguns dos principais frameworks ORM desenvolvidos para a linguagem Java tendo como objetivo principal avaliar o desempenho a fim de se obter dados que possam ser utilizados por outros desenvolvedores. Para facilitar tais testes, faz-se o uso da API JPA que permite a fácil migração entre esses frameworks com pequenas alterações em sua configuração. Palavras-chave: Persistência. Framework ORM. JPA. Benckmark. ABSTRACT Storage and data management activities are critical to information systems. These systems are supported mostly by managers relational database. Increasingly, such systems are being developed utilizing the concepts and object-oriented languages. In this context there is a great difference between the functioning of semantic concepts of object orientation, for the development of systems, and the concepts of relational databases, where applications developed persist your data. One possible solution would be to use ORM persistence frameworks that make the mapping between objects and relations (tables). This paper presents a comparative study between some of the major ORM frameworks developed for the Java language with the main objective to evaluate the performance in order to obtain data that can be used by other developers. To facilitate these tests, it is using the JPA API that allows easy migration between these frameworks with small changes to your configuration. Keywords: Persistence. ORM Framework. JPA. Benckmark Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 111 INTRODUÇÃO A persistência de dados, normalmente refere-se à ação de guardar dados em um banco de dados relacional. Essa abordagem de banco de dados relacionais é bem conhecida e possui gerenciamento flexível de dados. Segundo Bauer e King (2007, p. 6): "Devido ao completo e consistente fundamento teórico do modelo de dados relacional, banco de dados relacionais podem efetivamente garantir e proteger a integridade dos dados, dentre outras características desejáveis". Sistemas de gerenciamento de banco de dados relacionais não são específicos para uma linguagem de programação e nem a uma aplicação em particular. Esse princípio é conhecido como independência de dados, afinal os dados vivem por mais tempo que as aplicações. Segundo Bauer e King (2007) a tecnologia relacional fornece um modo de compartilhar os dados por entre essas diferentes aplicações, sendo então um denominador comum de vários sistemas e tecnologias das plataformas diferentes. O uso de linguagens orientadas a objetos tem se solidificado nos últimos anos. Segundo o site TIOBE Software (2011) esse tipo de linguagem é o que tem maior crescimento de uso nos últimos cinco anos. Existe uma diferença conceitual muito grande entre a programação orientada a objetos e a persistência de dados em bancos relacionais, o que geralmente causa grandes dificuldades durante o processo de desenvolvimento de software que fazem uso das duas abordagens. O Mapeamento de Objeto-Relacional (ORM) é uma abordagem que permite a construção de sistemas utilizando o paradigma orientado a objetos com a persistência, destes objetos, em bancos de dados relacionais. Com a utilização de técnicas e estratégias específicas, é possível mapear classes com seus atributos e associações para o modelo relacional (SILVA et al. apud Carvalho, 2006). Atualmente no mercado existem diversos frameworks ORM, bem como, aplicações de banco de dados, fazendo com que desenvolvedores tenham uma gama enorme de opções. Porem é necessário que essas aplicações promovam confiabilidade e robustez e principalmente consigam mapear os dados de forma correta e integra. O objetivo deste trabalho é analisar o desempenho dos principais frameworks ORM disponíveis para a linguagem Java: Hibernate, EclipseLink e Oracle TopLink, verificando-se a performance em diferentes situações. Para facilitar a migração entre Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 112 os frameworks será utilizado Java Persistence API (JPA) para interfacear os ORMs. Essa pesquisa pode ajudar a desenvolvedores optarem por determinados frameworks dependendo do contexto de suas aplicações. 1 FUNDAMENTOS CONCEITUAIS 1.1 Frameworks Framework é um projeto, que pode ser reutilizável em um sistema ou somente parte dele, representado por classes relacionadas. Segundo Pazin (2004, p. 16): “Framework é uma infra-estrutura genérica, baseada em um domínio, que pode ser adaptada para solucionar problemas específicos desse domínio, servindo como um modelo para a construção de aplicações através da especificação das classes e das colaborações entre elas”. O principal proposito de um framework é ajudar no processo de desenvolvimento de aplicações, permitindo que elas sejam desenvolvidas mais rapidamente e facilmente, resultando em uma aplicação de qualidade superior. Framework funciona como um molde para construção de aplicações e subsistemas, permite o reuso de código e de projeto, liberando o desenvolvedor de aspectos comuns da aplicação. Todas as aplicações construídas a partir de um mesmo framework apresentam características similares, diferenciando-se em seu comportamento, que varia conforme a necessidade da aplicação. Isso torna as aplicações desenvolvidas, a partir de frameworks mais fáceis de se manter e mais consistentes para os usuários que não precisam aprender diferentes aplicações. (PAZIN, 2004, p.16). 1.2 Persistência de dados em aplicações orientadas a objetos Objeto é a instancia de uma classe, e a persistência de seus dados permite a ele sobreviver ao processo que o criou, em outra palavras, o estado do objeto pode ser armazenado, e um objeto com um mesmo estado pode ser recriado em algum ponto no futuro. Este processo não está limitado a um objeto sozinho, redes inteiras de objetos interconectados podem ser persistentes. De acordo com Bauer e King (2007), a grande maioria dos objetos não é persistente, havendo também o objeto transiente que tem um tempo de vida Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 113 limitado, sendo delimitado pela vida do processo que o instanciou. Quase todas as aplicações Java possuem objetos persistentes e transientes e devido a isso se faz necessário um subsistema que gerencie esses dados persistentes. A persistência de dados sempre foi um problema entre os desenvolvedores Java, muitos automatizavam funções existentes no sistema e as armazenavam no banco de dados, ou seja, com as mudanças no sistema ou troca do banco de dados acabava-se tornando um transtorno, afinal em muitos casos o banco de dados tem um dialeto próprio. A intenção dos frameworks ORM é tentar construir aplicações que permitam portabilidade total. Segundo Carvalho (2008) o ORM se comporta como uma camada que possui uma gama de métodos que cuidam de tarefa, tais como: create (cria um novo objeto da classe a partir dos dados da tabela), find (busca um determinado registro no banco e o torna um objeto da classe), delete (exclui registros do banco) e update (atualiza registros de uma tabela de acordo com as solicitações). Esses métodos variam de acordo com a linguagem que será utilizada pelo desenvolvedor. Os bancos de dados relacionais modernos fornecem uma representação estruturada dos dados persistentes. Segundo Bauer e King (2007) ele permite a manipulação, classificação, busca e a agregação dos dados e os sistemas de gerenciamento de banco de dados são responsáveis por gerenciar a concorrência e a integridade dos dados e também compartilhar os dados entre os múltiplos usuários e múltiplas aplicações. Para utilizar qualquer uma das aplicações de banco de dados disponíveis no mercado é necessário um entendimento sólido do modelo relacional e de SQL, que é a linguagem para sua manipulação. O banco de dados é somente uma das partes do ORM a outra parte consiste nos objetos da sua aplicação Java que necessitam ser persistidos e carregados no banco de dados utilizando o SQL. Quando se trabalha com um banco de dados SQL em uma aplicação Java, o código Java trata das declarações para o banco de dados via API de Conectividade chamada, Java Database Connectivity (JDBC). Seja o SQL embutido no código Java, escrito a mão, ou mesmo gerado dinamicamente pelo Java, acaba-se utilizando a API JDBC para vincular os argumentos, no intuito de preparar os parâmetros para consulta, executar as consultas, recuperar valores, assim por diante. Essas são tarefas de acesso aos Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 114 dados de baixo nível. O que se busca é escrever um código que salve e recupere os objetos - instancias das classes- no banco de dados sem esse penoso trabalho de baixo nível. 1.3 Frameworks de Mapeamento Objeto-Relacional (ORM) 1.3.1 Hibernate O Hibernate é um framework que se relaciona com o banco de dados relacional garantindo ao desenvolvedor a transparência no mapeamento objeto/relacional. Para isso, o deve-se seguir algumas regras para desenvolvimento, e o restante da comunicação com o banco de dados fica com sobre a responsabilidade do framework O Hibernate é uma ferramenta que faz o mapeamento objeto/relacional no ambiente Java. O termo de mapeamento de objeto/relacional se refere à técnica de mapear uma representação de dados de um modelo de objeto para dados de modelo relacional com o esquema baseado em SQL. (HIBERNATE, s.d) O Hibernate automatiza muitas tarefas de códigos repetitivas, mas não cuida somente do mapeamento de classes Java para tabelas de banco de dados (e de tipos de dados em Java para tipos de dados em SQL), fornece também facilidade de consultas e recuperação de dados, podendo reduzir significantemente o tempo de desenvolvimento gasto com a manipulação manual de dados no SQL e JDBC. Graças ao Hibernate, o esquema de banco de dados pode ser facilmente melhorado e manipulado, permitindo criar uma implementação apropriada do modelo de domínio mais tarde. (HIBERNATE, s.d). 1.3.2 EclipseLink O Eclipse Persistence Services Project, mais conhecido como EclipseLink, é uma solução abrangente de persistência open source. Seu projeto foi iniciado por uma doação do código-fonte completo e suítes de teste de produtos da Oracle TopLink. Este projeto traz a experiência de mais de 12 anos de uso comercial e de desenvolvimento .(CLARKE, 2008). Similar ao Hibernate, a intenção do projeto é oferecer uma solução baseada em padrões centrados no JPA, mas com a capacidade de usar recursos avançados Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 115 para aquelas aplicações onde são necessários. Segundo Clarke (2008), o serviço de persistência mais popular do EclipseLink é lidar com bancos de dados relacionais através de JPA. Segundo Clarke (2008): “Este apoio de mapeamento tem evoluído ao longo de muitos anos de uso comercial lidando com muitos modelos de domínio e esquemas relacionais. O apoio resultante é suportado através de JPA sempre que possível e configurável com mapeamentos”. O EclipseLink apresenta uma solução poderosa e original de cache, enquanto outras soluções de persistência armazenam em cache as linhas de dados e reconstroem objetos quando ocorre um cache hit, EclipseLink mantém em cache as entidades com todas as conversões de dados definidos. (Clarke, 2008) 1.3.3 Oracle TopLink O TopLink permite mapear um modelo de objeto Java e Java Beans para um banco de dados relacional e as fontes de dados não-relacionais. Ele faz a ponte entre objetos e as relações que existem entre eles e os bancos de dados relacionais. Com TopLink o usuário pode reduzir o tempo e o custo de desenvolvimento pois ele proporciona a utilização de um comprovado padrão da indústria de frameworks de persistência. (MANUAL, 2002). TopLink permite desenvolver aplicações de alto desempenho e escalábilidade usando um rico conjunto de comprovado desempenho. (MANUAL, 2002). De acordo com o Manual (2002) o TopLink fornece recursos como: a) Manter a independência de plataforma através da utilização de um produto Java 100 por cento puro que podem ser executados em qualquer ambiente Java ou servidor de aplicativos Java. b) Manter a independência de dados através da utilização do TopLink no nível do objeto e API nível de objeto de consulta. c) Acessar qualquer banco de dados através de um driver JDBC compatível e acesso não-relacional a fontes de dados através de TopLink SDK para Sistemas de Informação Empresariais. d) Integra-se com tecnologia de ponta Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 116 1.3.4 Java Persitence API (JPA) O JPA lida com a forma como os dados relacionais são mapeados para objetos Java, a maneira que esses objetos são armazenados em um banco de dados relacional para que eles possam ser acessados em um momento posterior, e a existência continuada de um estado da entidade mesmo após a aplicação que usa ela termina. Além de simplificar o modelo de persistência da entidade, o JPA padroniza mapeamento objeto-relacional. (BISWAS; ORT, 2006). Para Biswas e Ort (2006), Java Persistence API baseia-se em ideias de frameworks de persistência de liderança e APIs como Hibernate, TopLink da Oracle e Java Data Objects. O JPA simplifica o modelo de programação para a persistência de entidade. Abaixo uma lista rápida de recursos segundo Biswas e Ort (2006). a) Requer menos classes e interfaces b) Praticamente elimina os descritores de implementação prolongados através de anotações c) Endereços mais especificações típicas através de padrões de anotação. d) Fornece mais limpo, mais fácil, mapeamento objeto-relacional padronizados. e) Elimina a necessidade de código de pesquisa. f) Adiciona suporte para herança, polimorfismo, e consultas polimórficas. g) Adiciona suporte para named (estático) e consultas dinâmicas. h) Java fornece uma linguagem de consulta Persistência. i) Torna mais fácil para testar entidades fora do container EJB. j) Pode ser usada fora do recipiente k) Pode ser usado com pluggable, terceiros prestadores de persistência 2 PROTÓTIPO DE APLICAÇÃO PARA OS CASOS DE TESTES O objetivo deste trabalho é analisar o desempenho dos principais frameworks ORM disponíveis para a linguagem Java, para isso foram realizados testes utilizando-se um protótipo de sistema simples para a gestão de vendas on-line, onde é possível realizar a venda de determinados produtos a clientes. A Figura 1 ilustra o Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 117 diagrama de classes desse protótipo. Figura 1. Diagrama de classes Prototipo vendas on-line Fonte: Elaborado pelos autores, 2012. Como estratégia para os testes desenvolvidos foi utilizado o banco de dados Oracle como padrão. Os testes foram baseados na utilização dos frameworks: TopLink, EclipseLink e Hibernate, onde todos fazem as mesmas operações no banco de dados. A análise se fundamentou no tempo de execução dessas operações em cada um dos frameworks apresentados. Os testes foram desenvolvidos utilizando-se o ambiente de desenvolvimento intregrado (IDE) NetBeans 6.9.1. A operação escolhida para a análise foi a de inserção e os testes foram aplicados nas seguintes classes: Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 118 a) Unidade Medida: onde não ocorre nenhuma relação de dependência e nem associação entre objetos (tabela sem recebimento de chaves estrangeiras). b) Pessoa Física: que herda da classe Cliente. c) Produto: que possui relacionamento de associação com a classe Unidade Medida (isso gera uma tabela que recebe uma chave estrangeira). d) Venda: possui relação com duas classes, uma associação com a classe Clientes e uma associação com a classe Itens Vendidos, que por sua vez tem agregação com Produtos. e) Todas as classes do sistema. As inserções foram feitas com: 1 objeto, 1.000 objetos, 5.000 objetos e 10.000 objetos, produzindo respectivamente 1 linha, 1.000 linhas, 5.000 linhas e 10.000 linhas nas tabelas do banco de dados. Os testes foram realizados em um computador com as seguintes configurações: a) Processador: Intel Atom N455 1666 MHz. b) Modelo: Hewlett-Packard HP Mini 110-3100. c) Memória RAM: 2036 MB. d) Interface da unidade de armazenamento: Serial ATA II. e) Sistema Operacional: MS Windows 7 Ultimate Service Pack 1. 3 RESULTADOS DOS TESTES 3.1 Teste 1: Persistência de objetos da classe Unidade de Medida A Figura 2 ilustra o gráfico com os resultados do Teste 1. Percebe-se que não houve variações significativas de tempos de execução nos três tipos de frameworks utilizados, visto que ocorreu apenas uma diferença de 1 segundo nos testes de inserção de linhas. Sendo assim, com inserções de 1.000 objetos o EclipseLink foi 1 segundo mais rápido que os demais; com inserções de 5.000 objetos o Hibernate foi um segundo mais rápido que os demais; com inserções de 10.000 objetos o Oracle TopLink foi 1 segundo mais rápido que os demais. Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 119 Figura 2: Teste tabela Unidade Medida Fonte: Elaborado pelos autores, 2012. 3.1.1 Teste 2: Persistência de objetos utilizando Herança Figura 3: Teste tabela Pessoa Física Fonte: Elaborado pelos autores, 2012. A Figura 3 ilustra o gráfico como os resultados do Teste 2. Observando-se esse gráfico é possível perceber que nos testes realizados com inserções de 5.000 objetos houve-se um desenpenho um pouco maior com o TopLink em relação aos demais, sendo ele 8 segundos mais rápido que o Hibernate por exemplo, porém ao aumentar as inserções para 10.000 objetos o Hibernate mostrou-se mais rápido 10 segundos em relação ao TopLink e 33 segundos que o EclipseLink. Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 120 3.3 Teste 3: Persistência de objetos que possui relacionamento com uma classe Os resultados, ilustrados no gráfico da Figura 4, apresentam um melhor desempenho no framework EclipseLink com inserções de 5.000 objetos, sendo 3 segundos mais rapido que o TopLink e 5 segundos mais rapido que o Hibernate, porém, o desempenho do Framework Hibernate e TopLink foram melhor em 20 segundos sobre o EclipseLink nos testes de inserções com 10.000 objetos. Figura 4: Teste tabela Produto Fonte: Elaborado pelos autores, 2012. 3.4 Teste 4: Persistência de objetos com dois relacionamentos No teste com a classe Venda verifica-se um desempenho consideravelmente bom do framework TopLink em relação aos demais frameworks. Seu desempenho foi melhor em 1.000, 5.000 e 10.000 inserções de objetos. Nos testes com 10.000 inserções de objetos o TopLink teve um desempenho melhor sobre o Hibernate de 4 segundos e sobre o EclipseLink de 10 segundos. Tal situação pode ser verificada na Figura 5 que ilustra tal teste. Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 121 Figura 5: Teste tabela Venda Fonte: Elaborado pelos autores, 2012. 3.5 Teste 5: Inserção em todas as classes do sistema Figura 6: Inserção em todas as tabelas Fonte: Elaborado pelos autores, 2012. Na figura 6, verifica-se um desempenho melhor do Framework TopLink em inserções de 1.000 objetos, sendo mais rápido que o segundo (Hibernate) em 4 segundos, nas inserções de 5.000 objetos o topLink manteve seu desempenho melhor em, 8 segundos sobre o EclipseLink e 9 segundos sobre o Hibernate. Nas inserções de 10.000 objetos o topLink também foi melhor que os demais, sendo 17 Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 122 segundos mais rápido que o Hibnernate e 21 segundos mais rápido que o EclipseLink. CONCLUSÃO Vem se tornando cada dia mais importante a criação de sistemas computacionais que respondam cada vez mais rápido às grandes demandas de acesso a dados. Devido a isso é necessário, garantir que o acesso aos dados seja feito de modo eficiente, especialmente em aplicações corporativas. Nesse contexto, este trabalho apresentou um estudo comparativo entre três frameworks de persistência Java: EclipseLink, TopLink e Hibernate. Tais frameworks diminuem o tempo necessário de desenvolvimento de aplicações orientadas a objetos que necessitam persistir seus dados em banco de dados relacionais, porém, isso não significa que o acesso aos dados será sempre mais rápido. Quando poucos dados são adicionados, a diferença entre o desempenho dessas implementações não é significativo. Entretanto essa afirmativa não é verdade quando se tratam de grandes volumes de dados. Em outras palavras, inserir, por exemplo, uma ou dez linhas em um banco de dados não mostrará diferenças significativas de desempenho, porém inserir 5.000 ou 10.000 linhas apresentam diferenças significativas no desempenho. Considerando que todas as implementações foram usadas com o mínimo de recursos possíveis para o funcionamento destas, o TopLink foi, sem dúvidas, a implementação mais estável de todas, estando entre as mais rápidas na inserção de tabelas simples e sendo a mais rápida nas tabelas mais complexas, como demonstrado nos testes. Em testes feitos anteriormente por Barbon (2011), onde foram testados os Frameworks Hibernate e TopLink, com inserções e seleções no banco de dados MySQL foi verificado um melhor desempenho do Framework Hibernate, com grandes diferenças, onde em sua maioria os resultados foram quase metade do tempo de resposta. Essa divergência de resultados pode ser fundamentada no fato do uso do uso de um banco de dados diferente, nos testes feitos por Barbon (2011) foi utilizado o MySQL como já foi dito, e na proposta deste trabalho foi utilizado o Oracle e isso Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 123 pode ter auxiliado para que o Framework da Oracle – TopLink – tenha tido um melhor desempenho. Esse estudo fundamenta-se apenas e operações de inserções, o que limita bastante essa conclusão deste trabalho. Como proposta para trabalhos futuros, sugere-se a criação de um conjunto de teste que simule todas as operações básicas de um banco de dados: INSERT, UPDATE, DELETE e SELECT. Nesses testes pode-se ainda tentar o uso de outras bases de dados como MySQL, PostGres, SQL Server, DB2 entre outras. Aumentar a quantidade de vezes de realização dos testes, para que se possa observar se há mudanças significativas no tempo de realização das ações pode ser uma outra sugestão para aumentar a credibilidade dos resultados apresentados. REFERÊNCIAS BARBON, S. Comparação de desempenho entre Hibernate e TopLink para persistência baseada em JPA com MySQL. Patternizando, 11 jan 2011. Disponível em: <http://www.patternizando.com.br/2011/01/comparacao-dedesempenho-entre-hybernate-e-toplink-para-persistencia-baseada-em-jpa-commysql/> Acesso em: 17 mai. 2012. BAUER, C; KING, G. Java Persistence com Hibernate. Rio de Janeiro: Ciência Moderna, 2007. BISWAS, R.; ORT, E. A Java Persistence API - um modelo mais simples de programação para a persistência da entidade. Oracle, mai 2006. Disponível em: <http://www.oracle.com/technetwork/articles/javaee/jpa-137156.html> Acesso em: 15 nov. 2011. CARVALHO, L. Object-Relational Mapping(ORM) – Mapeamento de ObjetoRelacional. RedRails, 13 abr 2011. Disponível em:<www.redrails.com.br/ 2011 /04/object-relational-mappingorm-mapeamento-de-objeto-relacional/> Acesso em: 15 set. 2011. CLARKE, D. Apresentando EclipseLink. Eclipse Zone, 30 jun 2008. Disponível em: <http://eclipse.dzone.com/articles/introducing-eclipselink?page=0,0> Acesso em: 14 nov. 2011 HIBERNATE. Community Documentation. Hibeernate, [s.d.] Disponível em: <http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/architecture. html> Acesso em: 14 nov. 2011. MANUAL. Oracle9iAs TopLink. Oracle, ago 2002. Disponível em: <http://download.oracle.com/docs/cd/A9768816/toplink.903/b10061.pdf> Acesso em: Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 124 14 nov. 2011. PAZIN, A. GawCRe: Um gerador de aplicações baseadas na web para o domínio de clinicas de reabilitação. 2004. Dissertação (Mestrado em Ciências da Computação) – Universidade Federal de São Carlos, Centro de Ciências Exatas e de Tecnologia, São Carlos. TIOBE Programming Community index de novembro de 2011. Tiobe software, [s.d.]. Disponível em: <www.tiobe.com/index.php/content/paperinfo/tpci/index.html> Acesso em: 23 set. 2011. Universitári@ - Revista Científica do Unisalesiano – Lins – SP, ano 4., n.8, jan/jun de 2013 125