Você está na página 1de 24

COMPARANDO A IMPLEMENTAO DA CAMADA DE PERSISTNCIA UTILIZANDO JDBC E HIBERNATE ANNOTATION

Helivar Faria de Oliveira Junior1 Ricardo Santos Freitas Tiago Ribeiro Carneiro

RESUMO
O presente artigo apresenta e discute a implementao da camada de persistncia de uma aplicao web utilizando os mtodos JDBC e Hibernate Annotation. Espera-se que o trabalho possa contribuir com a tomada de deciso de desenvolvedores no momento de escolher uma tecnologia para implementar uma camada de persistncia de sua aplicao. Os resultados demonstraram a facilidade do uso do framework Hibernate, o qual cria uma camada de persistncia independente e abstrai do desenvolvedor 95% das tarefas de persistncia de dados, alm de dispensar o aprendizado de sintaxe de SQL e permitir usufruir da aplicao com um menor custo e manuteno, contribuindo para o aumento da produtividade. Palavras-chave: JDBC. Hibernate Anotation. Persistncia.

1 INTRODUO O uso de sistemas computacionais utilizados no gerenciamento de dados das empresas exige que as informaes sejam armazenadas (persistir) para consultas futuras, ou seja, a cada vez que um novo dado lanado na aplicao ele deve ser armazenado em um banco de dados relacional. Dessa forma, os dados podem ser utilizados sempre que se desejar emitir relatrios ou grficos, ou tomar decises. Esse armazenamento, ou conceito de persistncia, evita que usurio tenha que lanar sempre todos dados de entrada para que a aplicao fornea os resultados desejados. O presente trabalho tem como objetivo comparar a implementao da camada de persistncia de uma aplicao web utilizando duas tecnologias distintas, JDBC e framework Hibernate Annotation, buscando saber qual tecnologia proporcionar ao desenvolvedor maior produtividade, facilidade de manuteno e tempo de execuo na insero e consultas de dados persistentes.

Helivar Faria de Oliveira Junior e Ricardo Santos Freitas so graduandos do curso de Sistemas de Informao, das Faculdades Integradas de Fernandpolis, Fundao Educacional de Fernandpolis, 2010. E-mails: helivar_jeenyfer@hotmail.com; rikrdosfreitas@hotmail.com.br. Tiago Ribeiro Carneiro professor do curso de Sistemas de Informao dessas mesmas Faculdades.

2 MAPEAMENTO DE OBJETO RELACIONAL (MOR / ORM) Segundo Arajo (apud FERNANDES; LIMA, 2007, p. 4),
No decorrer de vrios anos projetos de aplicaes corporativas tiveram forte necessidade de otimizar a comunicao da lgica de negcio com base de dados. E essa necessidade ganhou mais intensidade com o crescimento dessas aplicaes, crescimento esse tanto em requisitos quanto em volumes de dados armazenados em base de dados.

Os primeiros bancos de dados relacionais foram criados na dcada de 80, quando apareceram para extinguir as bases de dados de arquivos. No mesmo perodo, foi criada a linguagem SQL, baseada em lgica relacional, a qual contava com vrias otimizaes em tarefas se comparada com as tecnologias da poca. Com isso, o tempo gasto para as comunicaes entre a base de dados e a aplicao foi consideravelmente diminudo. No incio da dcada de 90, j comeavam a surgir os primeiros modelos de banco de dados baseados no modelo orientado a objetos, que foi nomeado de modelo de mapeamento relacional (MOR/ORM). Tal modelo tem uma lgica de funcionamento que consiste em transformar os dados de um objeto em linha da tabela de um banco de dados, e vice-versa, transformando a linha de uma tabela em um objeto da aplicao.

3 PLATAFORMA JAVA O Java uma plataforma de software para produo e execuo de aplicaes interativas, dinmicas e seguras em sistemas computacionais. Essa plataforma tem revolucionado o desenvolvimento e disposio de aplicaes fornecendo um novo modelo de computao em rede. Alm de ser uma poderosa linguagem orientada a objetos, de natureza dinmica e mxima flexibilidade, no depende de nenhuma plataforma para ser executada (INTRODUO, 2006).

3.1 JDBC Java Database Connectivity (JDBC) uma Application Program Interface (API) para conectar aplicativos Java a sistemas gerenciadores de banco de dados (SGDB). O JDBC permite a codificao de pedido em Structured Query Language (SQL), que ento passada' para o SGDB (HBNER, 2008).

Segundo Srgio (2006), a especificao do JDBC baseada no padro X/Open SQL Call Level Interface (CLI), deixando-o muito parecido com o ODBC, que tambm e baseado neste padro. A principal diferena entre eles que o driver ODBC implementado em linguagem C nativa, j o JDBC pode ser implementado independente de plataforma, seguindo os ideais da linguagem Java. As principais vantagens do driver JDBC consistem no fato de que a API de programao a mesma para qualquer SGDB, descartando a necessidade de implementar aplicaes voltadas para um banco de dados especifico, mantendo assim a independncia da plataforma da linguagem Java (HBER, 2008). Segundo Srgio (2006), a API JDBC define um conjunto de classes da linguagem Java que representa conexes a base de dados, consultas SQL, resultados de consultas, informaes sobre banco de dados, ou seja, permite ao programador Java consultar banco de dados e manipular os resultados das consultas. A API (figura 1) implementada atravs de um gerenciador de drives que compatvel com mltiplos drives, permitindo conexes com diferentes bancos de dados, o qual se torna uma interface independente de qualquer SGDB, permitindo acesso genrico a banco de dados atravs de SQL com uma interface uniforme para diferentes fontes de dados. A estrutura do JDBC permite utilizar caminhos distintos para acessar a base de dados.

Figura 1 Estrutura da API. Fonte: JDBC, 2008.

A conexo com a base de dados utilizada pelo JDBC (figura 2) a classe2 DriverManager e duas interface, Driver e Connection. A classe Driver proporciona o ponto de partida para a conectividade de banco de dados respondendo s requisies de conexo da DriverManager. A classe DriverManager mantm a lista de implementaes de drivers. J a classe Connection utilizada para controlar a srie de instrues SQL base de dados e controlar o registro ou aborto dessas instrues.

Figura 2 Exemplo de conexo JDBC. Fonte: Os autores, 2010.

4 O HIBERNATE O Hibernate um framework Object-Relational Mapping (ORM), ou seja, mapeamento objeto relacional para aplicaes Java, ou ainda, uma ferramenta para mapear classes Java em tabelas do banco de dados e vice-versa (FERNANDES; LIMA, 2007). um servio de persistncia e consulta

objeto/relacional poderoso que permite o desenvolvimento de classes persistentes orientadas a objeto, includos associao, herana, polimorfismo, composio e colees (JARDIN, 2008). Segundo a documentao oficial, "o objetivo do Hibernate aliviar o desenvolvedor de 95 por cento das tarefas comuns de programao relacionadas persistncia de dados" (HIBERNATE, 2006), pois ele no realiza apenas o
2

Classe basicamente definio de um tipo de dado. Uma classe contm um conjunto de bits representando um estado e um conjunto de operaes que permitem modificar o estado (RICARTE, 2001).

mapeamento objeto relacional, mas tambm tem um poderoso mecanismo de consulta de dados, permitindo uma reduo no tempo de desenvolvimento de uma aplicao. Seu principal objetivo abstrair o desenvolvimento SQL da aplicao, fazendo com que o desenvolvedor no precise se preocupar com escrita de inserts, selects, updates ou deletes em SQL, bem como com a estrutura necessria para controle da persistncia dos dados. A figura 3 mostra como funciona a arquitetura do hibernate, que formada basicamente por conjuntos de interfaces que executam a conexo entre aplicao e base de dados, cujas interfaces principais de sua arquitetura so: Session, SessionFactory, Transaction, Query, Configuration.

Figura 3 Arquitetura do Hibernate. Fonte: Hibernate, 2006.

Tem-se, a seguir, a funo de cada interface da arquitetura (HIBERNATE, 2006): Session: responsvel por efetuar a comunicao entre aplicao e persistncia atravs de uma conexo JDBC; SessionFactory: responsvel por manter o mapeamento objeto relacional em memria; Transaction: responsvel por especificar unidades indivisveis de uma operao de manipulao de dados; Query: responsvel por efetuar as consultas na base de dados; Configuration: define as configuraes de inicializao do hibernate tais

como: driver da conexo, endereo da conexo, usurio e senha da base de dados etc. Tem-se um exemplo de configurao na figura 4.

Figura 4 Exemplo de configurao do hibernate. Fonte: Os autores, 2010.

4.1 Hibernate Annotations As anotaes so definidas como metadados que o compilador ignora do cdigo fonte, pois, em um cdigo Java, as funes que comeam com o smbolo @ (arroba) so definidas como uma anotao (figura 5). Esse recurso foi introduzido na linguagem Java a partir da verso Java SE 5.0 (FERNANDES; LIMA, 2007). No Hibernate, tais anotaes so as responsveis pelo mapeamento dos objetos da tabela do banco de dados, no sendo necessrio nenhum outro arquivo para que o mapeamento seja realizado. Alm do mapeamento por anotaes ser bem mais simples do que o mapeamento por arquivo XML, seu cdigo bem mais complexo. A figura 5 apresenta um exemplo de anotao que representa o mapeamento de uma classe, definida como uma entidade de banco de dado, referncia da tabela funcionrio no esquema hospital.

Figura 5 Exemplo de Anotaes em cdigo Java. Fonte: Os autores, 2010.

5 APLICAO Para desenvolvimento do presente trabalho, foi construda uma aplicao onde foram mapeadas as tabelas do banco de dados como mostra a figura 6, tabela cliente, vendedor, produto, pedido e a tabela item_pedido.

Figura 6 Tabelas mapeadas pela aplicao de teste. Fonte: Os autores, 2010.

A figura 7 demonstra como o projeto foi estruturado no Netbeans 6.9, utilizando o framework Hibernate Annotation.

Figura 7 Estrutura do projeto. Fonte: Os autores, 2010.

No quadro 1, esto representadas algumas classes persistentes, que foram utilizadas para implementar a classes de domnio de negcio.

@Entity @Table(name = "cliente", schema = "public") public class Cliente implements java.io.Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "codigo_cliente", unique = true, nullable = false) private int codigoCliente; @Column(name = "nome_cliente", length = 40) private String nomeCliente; @Column(name = "endereco", length = 40) private String endereco; @Column(name = "cidade", length = 20) private String cidade; @Column(name = "cep", length = 9) private String cep; @Column(name = "uf", length = 2) private String uf; @Column(name = "cnpj", length = 20) private String cnpj; @Column(name = "ie", length = 20) private String ie; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "cliente") private Set<Pedido> pedidos = new HashSet<Pedido>(0); public Cliente() { } //sets e gets. //------------}

Quadro 1 Mapeamento da Classe Cliente. Fonte: Os autores, 2010.

O quadro 1 representa o mapeamento da classe Cliente utilizando anotaes, as quais possuem o seguinte significado: @Entity - significa que a classe uma entidade, j @Table corresponde ao nome da tabela. J as colunas da tabelas so correspondentes aos atributos da classe; @Column - refere-se ao nome da coluna da tabela, a chave primaria da tabela representada por @Id; @GeneratedValue - utilizado pra gerar seqncia a uma coluna serial ou valor automtico. Utilizando da mesma estrutura mas sem o uso do framework Hibernate, foi criada uma aplicao utilizando apenas o JDBC puro. A figura 8 representa a estrutura do projeto.

Figura 8 Estrutura da Aplicao utilizando JDBC. Fonte: Os autores, 2010.

O quadro 2 demonstra a classe Cliente, onde diferentemente da aplicao do Hibernate, no existem anotaes e nem instncia as chaves estrangeiras.
package br.com.jdbc.model; public class Cliente { private int codigoCliente; private String nomeCliente; private String endereco; private String cidade; private String cep; private String uf; private String cnpj; private String ie; public Cliente() { } //sets e gets }

Quadro 2 Classe Cliente. Fonte: Os autores, 2010.

Para a configurao do Hibernate, necessrio configurar o arquivo principal, o hibernate.cfg.xml, arquivo onde esto todas as informaes de acesso ao banco e as classes mapeadas. O quadro 3 representa as configuraes do arquivo XML do Hibernate, onde existem as seguintes definies: hibernate.dialect Dialeto contendo caractersticas particulares do banco. Hibernate.conection.driver_class Classe do Driver utilizada para conexo. Hibernate.conection.url Url para efetuar a conexo.

10

Hibernate.conection.username Nome do usurio do banco. Hibernate.conection.senha Senha do usurio do banco. Mapping class Classes mapeadas.

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernateconfiguration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/tcc</prope rty> <property name="hibernate.connection.username">postgres</property> <property name="hibernate.connection.password">postdba</property> <mapping class="br.com.hibernate.model.ItemPedido"/> <mapping class="br.com.hibernate.model.Cliente"/> <mapping class="br.com.hibernate.model.Produto"/> <mapping class="br.com.hibernate.model.Pedido"/> <mapping class="br.com.hibernate.model.ItemPedidoId"/> <mapping class="br.com.hibernate.model.Vendedor"/> </session-factory> </hibernate-configuration>

Quadro 3 Arquivo XML de configurao do Hibernate. Fonte: Os autores, 2010.

O quadro 4 mostra a classe de conexo que utiliza o arquivo hibernate.cfg.xml mostrado no quadro 3, para efetuar a configurao e usar o mtodo buildSessionFactory, o qual retorna uma SessionFactory que ser o arquivo responsvel por receber e retornar objetos. Nela tambm se cria uma instncia do tipo Session que responsvel por abrir uma nova sesso a cada solicitao.
public class HibernateUtil { private static SessionFactory factory; static { Configuration conf = new AnnotationConfiguration(); conf.configure("\\br\\com\\hibernate\\util\\hibernate.cfg.xml"); factory = conf.buildSessionFactory(); } public static Session getSession() { return factory.openSession(); } }

Quadro 4 Classe de conexo usada pelo Hibernate. Fonte: Os autores, 2010.

11

Diferentemente do Hibernate, a conexo do JDBC no utiliza nenhum arquivo XML; feita apenas por uma classe como mostra o quadro 5. Sua implementao tambm simples, pois criado apenas um objeto do tipo Connection onde passada a url, usurio e senha que obtm a conexo com o banco, utilizando o driver especificado.
public class ConnectionFactory { public static Connection getConnection() throws Exception { try { Class.forName("org.postgresql.Driver"); return DriverManager.getConnection("jdbc:postgresql://localhost:5432/tcc", "postgres", "postdba"); } catch (Exception ex) { throw new Exception(ex.getMessage()); } } public static void closeConnection(Connection conn, Statement stmt, ResultSet rs) throws Exception { close(conn, stmt, rs); } } catch (Exception ex) { throw new Exception(ex.getMessage()); } } }

Quadro 5 Classe de conexo do JDBC. Fonte: Os autores, 2010.


public class DAO<T> { private Session session = null; private final Class classe; public DAO(Session session, Class classe) { this.session = session; this.classe = classe; } protected Session getSession() { return session; } public void cadastrar(T t) { this.session.save(t); } public void alterar(T t) { this.session.saveOrUpdate(t); } public void excluir(T t) { this.session.delete(t); }

12

public List<T> listar() { return this.session.createCriteria(this.classe).list(); } public T procura(int codigo) { return (T) this.session.get(this.classe, codigo); } public Criteria Criteria() { return (Criteria) this.session.createCriteria(this.classe); } }

Quadro 6 Classe DAO utilizada pelo Hibernate. Fonte: Os autores, 2010.

O quadro 6 apresenta a classe DAO, responsvel por gerenciar e encapsular o acesso aos dados. Os mtodos cadastrar, listar, excluir e alterar recebem um parmetro genrico T, que pode ser qualquer entidade mapeada. No necessrio implementar uma classe DAO para cada entidade que a aplicao utiliza. Alm da classe DAO, necessrio criar uma outra DAO, a DaoFactory, responsvel por instanciar a DAO genrica e fazer a conexo com o HibernateUtil, como mostra o quadro 4.
public class DaoFactory { private final Session session; private Transaction transaction; public DaoFactory() { session = HibernateUtil.getSession(); } public void beginTransaction() { this.transaction = this.session.beginTransaction(); } public void commit() { this.transaction.commit(); this.transaction = null; } public boolean hasTransaction() { return this.transaction != null; } public void rollback() { this.transaction.rollback(); this.transaction = null; } public void close() {

13

this.session.close(); } public DAO<Cliente> getClienteDAO() { return new DAO<Cliente>(this.session, Cliente.class); } public DAO<ItemPedido> getItemPedidoDAO() { return new DAO<ItemPedido>(this.session, ItemPedido.class); } public DAO<ItemPedidoId> getItemPedidoIdDAO() { return new DAO<ItemPedidoId>(this.session, ItemPedidoId.class); } public DAO<Pedido> getPedidoDAO() { return new DAO<Pedido>(this.session, Pedido.class); } public DAO<Produto> getProdutoDAO() { return new DAO<Produto>(this.session, Produto.class); } public DAO<Vendedor> getVendedorDAO() { return new DAO<Vendedor>(this.session, Vendedor.class); } }

Quadro 7 Classe DaoFactory. Fonte: Os autores, 2010.

O quadro 7 mostra a classe DaoFactory, responsvel por instanciar todas as entidades a classe DAO<T>, para que as entidades mapeadas possam ter acesso aos mtodos cadastrar, listar, alterar,excluir, ou seja, todos os mtodos que a classe DAO<T> possuir. Tambm responsvel por criar a Session a partir da HibernateUtil, e criar transaes para cada sesso.
public class ClienteDAOImp implements ClienteDAO { private Connection conn; public ClienteDAOImp() throws Exception { try { this.conn = ConnectionFactory.getConnection(); //System.out.println("Conectado com sucesso!"); } catch (Exception e) { throw new Exception("Problemas ao conectar o DB!: Erro: " + e.getMessage()); } } public void cadastrar(Cliente cliente) { PreparedStatement stmt = null; try { String sql = "INSERT INTO cliente( nome_cliente, endereco, cidade, cep, uf, cnpj, " + "ie) VALUES ( ?, ?, ?, ?, ?, ?, ?);";

14

stmt = conn.prepareStatement(sql); stmt.setString(1, cliente.getNomeCliente()); ... stmt.setString(7, cliente.getIe()); stmt.execute(); conn.commit(); //System.out.println("Cliente Inserido com Sucesso !"); } catch (SQLException e) { System.out.println("Problemas ao Cadastrar aluno! Erro: " + e.getMessage()); e.printStackTrace(); } finally { try { ConnectionFactory.closeConnection(conn, stmt); } catch (Exception e) { System.out.println("Problemas ao fechar statement! Erro: " + e.getMessage()); } } } public List<Cliente> listar() { PreparedStatement stmt = null; try { String sql = "SELECT * FROM cliente; "; stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); List<Cliente> resultado = new ArrayList<Cliente>(); while (rs.next()) { Cliente cliente = new Cliente(); cliente.setCodigoCliente(rs.getInt("codigo_cliente")); ............ cliente.setIe(rs.getString("ie")); resultado.add(cliente); } return resultado; } catch (Exception e) { System.out.println("Erro ao Listar ! Cliente! Erro: " + e.getMessage()); } finally { try { ConnectionFactory.closeConnection(conn, stmt); } catch (Exception e) { System.out.println("Problemas ao fechar statement! Erro: " + e.getMessage()); } } return null; } public void excluir(String uf) { PreparedStatement stmt = null; try { String sql = "DELETE FROM cliente WHERE uf = ?"; stmt = conn.prepareStatement(sql);

15

stmt.setString(1, uf); stmt.execute(); conn.commit(); //System.out.println("Cliente Inserido com Sucesso !"); } catch (SQLException e) { System.out.println("Problemas ao Cadastrar aluno! Erro: " + e.getMessage()); e.printStackTrace(); } finally { try { ConnectionFactory.closeConnection(conn, stmt); } catch (Exception e) { System.out.println("Problemas ao fechar statement! Erro: " + e.getMessage()); } } } public Cliente listarCliente(int codigo) { PreparedStatement stmt = null; try { String sql = "SELECT * FROM cliente WHERE codigo_cliente = ? "; stmt = conn.prepareStatement(sql); stmt.setInt(1, codigo); ResultSet rs = stmt.executeQuery(); Cliente cliente = new Cliente(); if (rs.next()) { cliente.setCodigoCliente(rs.getInt("codigo_cliente")); .......... cliente.setIe(rs.getString("ie")); } return cliente; } catch (Exception e) { System.out.println("Erro ao listar aluno! Erro: " + e.getMessage()); } finally { try { ConnectionFactory.closeConnection(conn, stmt); //System.out.println("Fechou Pedido Listar"); } catch (Exception e) { System.out.println("Problemas ao fechar statement! Erro: " + e.getMessage()); } } return null; } }

Quadro 8 Classe ClienteDAOImp. Fonte: Os autores, 2010.

O quadro 8 mostra os mtodos cadastrar, excluir,listar, listarCliente da classe cliente.

16

Ao contrrio da classe DAO utilizada pelo Hibernate, no JDBC necessrio criar uma classe DAO para cada tabela que se utiliza pela aplicao, pois os mtodos empregam a linguagem SQL para apenas uma tabela do banco de dados.

5.1 Anlise de tempo O loop utilizado para o obter os tempos em milissegundos, mostrado no quadro 9.
long inicio = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { cs = factory.getClienteDAO().listar(); vd = factory.getVendedorDAO().listar(); } long fim = System.currentTimeMillis(); long tempo = ((fim

- inicio) / 1.0);

Quadro 9 Loop utilizado para obter tempo em milissegundos. Fonte: Os autores, 2010.

O quadro 9 representa o cdigo utilizado para obter o tempo gasto em cada operao, feita pelas aplicaes. A varivel incio responsvel por capturar o tempo do sistema antes de ser iniciado o loop, transformando a hora atual do computador em milissegundos atravs do mtodo currentTimeMillis(). Aps o termino do lao for, a varivel fim captura o tempo do sistema novamente. O tempo gasto determinado pela subtrao do valor da varivel fim pelo valor da varivel inicio. Para a comparao de desempenho das aplicaes foram utilizados os seguintes testes.

1. Teste 1 A simulao foi realizada em ambas as aplicaes; A consulta foi executada dentro de um loop de 50 vezes; Foram realizadas as seguintes consultas: Consulta uma tabela SELECT * FROM cliente; Consulta duas tabelas SELECT * FROM cliente;

17

SELECT * FROM vendedor; Consulta quatro tabelas SELECT * FROM cliente; SELECT * FROM vendedor; SELECT * FROM produto; SELECT * FROM pedido; Quantidade de dados. Todas as tabelas com 500 linhas. 2. Teste 2 A simulao foi realizada em ambas as aplicaes; A consulta foi executada dentro de um loop de 50 vezes; Foram realizadas as seguintes consultas: Consulta uma tabela SELECT * FROM cliente; Consulta duas tabelas SELECT * FROM cliente; SELECT * FROM vendedor; Consulta quatro tabelas SELECT * FROM cliente; SELECT * FROM vendedor; SELECT * FROM produto; SELECT * FROM pedido; Quantidade de dados. Todas as tabelas com 1000 linhas.

3. Teste 3 A simulao foi realizada em ambas as aplicaes; A consulta foi executada dentro de um loop de 50 vezes; Foram realizadas as seguintes consultas: Consulta uma tabela SELECT * FROM cliente; Consulta duas tabelas SELECT * FROM cliente;

18

SELECT * FROM vendedor; Consulta quatro tabelas SELECT * FROM cliente; SELECT * FROM vendedor; SELECT * FROM produto; SELECT * FROM pedido;

Quantidade de dados. Todas as tabelas com 5000 linhas. 4. Teste 4 A simulao foi realizada em ambas as aplicaes; A consulta foi executada dentro de um loop de 50 vezes; Foram realizadas as seguintes consultas: Consulta uma tabela SELECT * FROM cliente; Consulta duas tabelas SELECT * FROM cliente; SELECT * FROM vendedor; Consulta quatro tabelas SELECT * FROM cliente; SELECT * FROM vendedor; SELECT * FROM produto; SELECT * FROM pedido;

Quantidade de dados. Todas as tabelas com 10000 linhas.

5. Teste 5 A simulao foi realizada em ambas as aplicaes; A consulta foi executada dentro de um loop de 50 vezes; Foram realizadas as seguintes consultas: Consulta uma tabela SELECT * FROM cliente;

19

Consulta duas tabelas SELECT * FROM cliente; SELECT * FROM vendedor; Consulta quatro tabelas SELECT * FROM cliente; SELECT * FROM vendedor; SELECT * FROM produto; SELECT * FROM pedido;

Quantidade de dados. Todas as tabelas com 15000 linhas.

6. Teste 6 A simulao foi realizada em ambas as aplicaes; A insero foi executada dentro de um loop de 100 vezes; Foi realizada a seguinte incluso: INSERT INTO cliente( nome_cliente, endereco, cidade, cep, uf, cnpj, ie) VALUES ( Teste, Rua Teste, Testando, 32.435-900, MG, 654.545.677/5654-78,546.543/456.56).

7. Teste 7 A simulao foi realizada em ambas as aplicaes; A transao foi executada dentro de um loop de 100 vezes; Foi realizada a seguinte incluso: DELETE FROM cliente WHERE uf = MG.

Tabela 1 Tempo de processamento para executar o teste 1 Uma tabela Duas tabelas JDBC 10567,0 10769,0 12122,0 12982,0 12087,0 Mdia 11705,4 Fonte: Os Autores, 2010. Hibernate 328,0 365,0 738,0 453,0 259,0 428,6 JDBC 23098,0 23683,0 24942,0 23057,0 25598,0 24075,6 Hibernate 1007,0 1229,0 1317,0 1326,0 1211,0 1218,0

Quatro tabelas JDBC 50343,0 51861,0 54538,0 52539,0 54059,0 52668,0 Hibernate 3347,0 4974,0 4557,0 5266,0 4536,0 4536,0

20

A tabela 1 mostra o tempo de processamento em milissegundos, apresentado no teste 1, onde o Hibernate tem um desempenho consideravelmente superior ao JDBC.
Tabela 2 Tempo de processamento para executar a consulta do teste 2 Uma tabela Duas tabelas Quatro tabelas JDBC Hibernate JDBC Hibernate JDBC Hibernate 11267,0 649,0 25986,0 3387,0 55173,0 10348,0 14718,0 1158,0 27604,0 4726,0 57380,0 12076,0 15057,0 1025,0 29172,0 5455,0 57863,0 11051,0 14846,0 1060,0 29489,0 4423,0 60084,0 11345,0 14310,0 847,0 29498,0 4493,0 59464,0 11784,0 Mdia 14039,6 Fonte: Os autores, 2010. 947,8 28349,8 4496,8 57992,8 11320,8

A tabela 2 representa o tempo de execuo das duas aplicaes na simulao do teste 2. O JDBC tambm obteve um desempenho inferior mesmo com o aumento de dados nas tabelas em que foram efetuadas as consultas.
Tabela 3 Tempo de processamento para executar a consulta do teste 3 Uma tabela Duas tabelas Quatro tabelas JDBC Hibernate JDBC Hibernate JDBC Hibernate 19437,0 6860,0 44222,0 30816,0 83443,0 47458,0 24770,0 6405,0 48196,0 28543,0 84829,0 60475,0 22928,0 9698,0 48471,0 31554,0 83410,0 62746,0 24360,0 6942,0 48438,0 30489,0 82879,0 68557,0 23421,0 10455,0 47075,0 31671,0 84457,0 54752,0 Mdia 22983,2 Fonte: Os autores, 2010. 8072,0 47280,4 30614,6 83803,6 58797,6

Na tabela 3, pode-se ver que, apesar do Hibernate perder um pouco do seu desempenho, ele, ainda, est com um desempenho melhor que o JDBC, pois no teste 3 a quantidade de dados dobrou de quantidade.

21

Tabela 4 Tempo de processamento em milissegundos para executar a consulta teste 4 Uma tabela Duas tabelas Quatro tabelas JDBC Hibernate JDBC Hibernate JDBC Hibernate 35491,0 16290,0 79258,0 65005,0 118980,0 108101,0 40480,0 16904,0 77568,0 67858,0 122962,0 119080,0 39087,0 19198,0 76958,0 72736,0 125781,0 124289,0 41752,0 17954,0 80460,0 70296,0 121867,0 124255,0 42127,0 19731,0 83324,0 72366,0 126803,0 129954,0 Mdia 39787,4 Fonte: Os autores, 2010. 18015,4 79513,6 69652,2 123278,6 121135,8

Na tabela 4, verifica-se que o hibernate perde bastante o seu desempenho, na consulta a quatro tabelas, mas ainda tem um desempenho melhor em relao ao JDBC.
Tabela 5 Tempo de processamento em milissegundos para executar consulta teste 5 Uma tabela Duas tabelas Quatro tabelas JDBC Hibernate JDBC Hibernate JDBC Hibernate 57987,0 21028,0 99338,0 78964,0 156813,0 993490,0 62519,0 31720,0 96298,0 93018,0 167560,0 1111468,0 67253,0 34907,0 101188,0 98310,0 174646,0 1169259,0 63298,0 38420,0 102470,0 116612,0 173515,0 1183186,0 66259,0 38376,0 101312,0 118643,0 179129,0 1183599,0 Mdia 63463,2 32890,2 100121,2 101109,4 170332,6 1128200,4

Fonte: Os autores, 2010.

Na tabela 5 o JDBC demonstra ter um desempenho melhor sobre o Hibernate, pois o Hibernate perdeu seu desempenho consideravelmente com uma grande quantidade de dados.
Tabela 6 Tempo de processamento da cadastrar registros teste 6 JDBC 7416,0 7604,0 7634,0 7244,0 7313,0 7442,2 Hibernate 432,0 431,0 435,0 416,0 418,0 426,4

Mdia

Fonte: Os autores, 2010.

22

Os resultados mostrados na tabela 6 so aqueles obtidos com a simulao apresentada no teste 6, em que o JDBC teve um desempenho inferior para a funo de insero de dados ao banco de dados.
Tabela 7 Tempo de processamento em milissegundos para a simulao do teste 7 JDBC 213,0 207,0 229,0 214,0 229,0 218,4 Hibernate 197,0 182,0 126,0 181,0 146,0 166,4

Mdia

Fonte: Os autores, 2010.

No tempo de processamento do teste 7, que o teste de excluso de dados, os tempos gastos mostrados na tabela 7 tambm revelam que o Hibernate tem um desempenho superior ao JDBC.

Mdia de tempo de consultas


500000.0 Milissegundos 400000.0 300000.0 200000.0 100000.0 0.0 Teste 1 Teste 2 Teste 3 Teste 4 Teste 5 JDBC Hibernate

Grfico 1 Mdia de tempo para consultas. Fonte: Os autores, 2010.

No grfico 1, verifica-se que o Hibernate vai perdendo seu desempenho sobre o JDBC de acordo com a quantidade de dados utilizadas para consulta. At o teste 4 o Hibernate tem seu desempenho melhor que o JDBC, j no teste 5 o JDBC assume um desempenho bem superior ao Hibernate.

23

6 CONSIDERAES FINAIS Nos tempos atuais, quando se busca um alto desempenho nas aplicaes web para efetuar transaes em aplicaes e banco de dados, novas tecnologias surgem diariamente. Neste artigo, foram apresentadas a diferenas entre duas tecnologias para se criar uma camada de persistncia, cujo objetivo ajudar o desenvolvedor a escolher uma tecnologia distinta para implement-las. Foram implementadas duas aplicaes web, uma utilizando o JDBC e outra o framework Hibernate Annotation para se criar a camada de persistncia. Foi observado que a aplicao que utilizou o framework Hibernate teve uma reduo de cdigo significativa a ser implementado pelo desenvolvedor. Alm disso, nas simulaes de teste feitas, teve um desempenho bem superior para efetuar suas operaes com o banco de dados, quando a quantidade de dados de pequena para mdia, j em grandes quantidades seu desempenho fica inferior ao JDBC. O JDBC uma tecnologia que pode ser considerada eficaz para a construo de uma camada de persistncia, pois existem vrias vantagens sobre o Hibernate, mas, em comparao com o desempenho e produtividade, o trabalho apresentou que ela j e uma tecnologia que produz um desempenho menor com relao ao Hibernate, onde a quantidade de dados relativamente pequena, mas de acordo com que a quantidade de dados aumenta seu desempenho vai se igualando ao Hibernate, ate que seu desempenho fica superior ao Hibernate. Considerando que, hoje, as empresas prezam desempenho e produtividade, o Hibernate pode ser uma tecnologia empregada para se construir a camada de persistncia de uma aplicao web, em condies que utilizem pequenas ou mdias quantidades de dados, pois, alm de seu desempenho superior ao JDBC, ele uma ferramenta que agiliza o desenvolvimento da aplicao, e o desempenho para operaes de insero, consulta e excluso na base de dados bem aceitvel, nestas condies. J para grandes quantidades de dados necessrio avaliar esse desempenho inferior, pois o usurio final talvez nem perceba essa diferena, pois o desenvolvimento com o framework Hibernate Annotation mais vantajoso em relao ao JDBC.

24

ABSTRACT COMPARING AN IMPLEMENTATION OF THE PERSISTENCE LAYER BY USING JDBC AND HIBERNATE ANNOTATION This article presents and discusses the implementation of the persistence layer of a web application using Hibernate and JDBC methods Annotation. It is hoped this work can contribute to developers decision making when choosing a technology to implement a persistence layer of their application. The results demonstrated that using the Hibernate framework is easy, which creates an independent persistence layer and it abstracts from the developer 95% of the tasks of data persistence, and it dispenses learning SQL syntax; it also allows the application to enjoy a lower cost and maintenance, contributing to increased productivity. Keywords: JDBC. Hibernate Anotation. Persistence.

REFERNCIAS FERNANDES, Raphaela Galhardo; LIMA, Gleydson de A. Ferreira. Hibernate com Anotaes. Disponvel em: <ftp://users.dca.ufrn.br/UnP2007/Hibernate_Anotacoes.pdf > . Acesso em: 21 jun. 2010. HIBERNATE. (2006). Documentao da referncia do Hibernate. Disponvel em: <http://www.hibernate.org>. Acesso em: 29 maio 2010. HBNER, Jomi Fred. Acesso a bancos de dados em Java (JDBC). Disponvel em: <http://www.inf.furb.br/~jomi/java/pdf/jdbc.pdf>. Acesso em: 29 maio 2010. INTRODUO ao Java. Disponvel em: <http://www.guich.com/pf/capitulo2.html>. Acesso em: 22 jun. 2010. JARDIN, Rodrigo Urubatan Ferreira. Desenvolvimento Java Enterprise Edition usando JSF + Spring Framework e Hibernate. Disponvel em: <http://www.urubatan.com.br/uploads/sepai_desenv_web.pdf>. Acesso em: 29 maio 2010. JDBC. Trabalhando com banco de dados em Java. Disponvel em: <http://www.inf.unisinos.br/~barbosa/grefe/atividades/at5/leonardo_5.pdf>. Acesso em: 29 maio 2010. RICARTE, Ivan Luiz Marques. Definio de classes. Disponvel em: <http://www.dca.fee.unicamp.br/cursos/POOCPP/node39.html >. Acesso em: 22 jun. 2010. SRGIO, Wilson. JDBC. Disponvel em: <http://wilscar.sites.uol.com.br/jdbc.htm>. Acesso em: 23 jun. 2010.

Você também pode gostar