Proxy do Hibernate

1 resposta
B

Galera, estou fazendo uma aplicação simples com uso de proxy para testar se com ou sem proxy o carregamento de uma classe funciona mais rápido.

Tenho duas classes Cliente e Pedidocliente, a primary key idcliente, está ligada com pedidocliente. ligação um para muitos.

Estou fazendo alguns testes inserindo um Pedidocliente carregando o cliente através de uma hora com o método load (com proxy) e outra com get (acesso a banco), para ver
em qual deles a inserção é mais rápida, mas não estou obtendo resultados satisfatórios, pois o tempo para inserir, vários objetos no banco, é praticamente o mesmo, com ou sem proxy, alguém tem alguma idéia para ajudar????

Esta é minha classe cliente mapeada com annotations
@Entity
@Table(name = "cliente")
@org.hibernate.annotations.Proxy(lazy=true)
@NamedQueries( {
    @NamedQuery(name = "Cliente.findByIdcliente", query = "SELECT c FROM Cliente c WHERE c.idcliente = :idcliente"),
    @NamedQuery(name = "Cliente.findByNome", query = "SELECT c FROM Cliente c WHERE c.nome = :nome"),
    @NamedQuery(name = "Cliente.findByIdade", query = "SELECT c FROM Cliente c WHERE c.idade = :idade"),
    @NamedQuery(name = "Cliente.findByCidade", query = "SELECT c FROM Cliente c WHERE c.cidade = :cidade")
})
public class Cliente implements Serializable {
    
    @Id
    @Column(name = "idcliente", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idcliente;

Esta é minha classe Pedidocliente

@Entity
@Table(name = "pedidocliente")
@NamedQueries( {
    @NamedQuery(name = "Pedidocliente.findByIdpedido", query = "SELECT p FROM Pedidocliente p WHERE p.idpedido = :idpedido"),
    @NamedQuery(name = "Pedidocliente.findByValor", query = "SELECT p FROM Pedidocliente p WHERE p.valor = :valor"),
    @NamedQuery(name = "Pedidocliente.findByData", query = "SELECT p FROM Pedidocliente p WHERE p.data = :data")
})
public class Pedidocliente implements Serializable {
    
    @Id
    @Column(name = "idpedido", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idpedido;

Este é minha classe genérica do hibernate para operações com o banco.
/*
* HibenrateUtil.java
*
* Created on 2 de Abril de 2008, 23:40
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package banco;

import java.io.Serializable;
import model.Cliente;
import model.Pedidocliente;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

/**
*
* @author Berdam
*/

//Classe que inicializar a SessionFactory, que é a fábrica de Session,
//deve ser usada para startar a aplicação e somente quando finaliza.
public class HibernateUtil {


private static SessionFactory sessionfactory;
private Session session;
private Transaction tx;

static {
try {
AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.addAnnotatedClass(Cliente.class);
cfg.addAnnotatedClass(Pedidocliente.class);

sessionfactory = new AnnotationConfiguration().configure("banco/hibernate.cfg.xml").buildSessionFactory();
} catch (Throwable t){
throw new ExceptionInInitializerError(t);
}
}

public static SessionFactory getSessionFactory(){
return sessionfactory;
}

public static void shutdown(){
getSessionFactory().close();
}

public void AbreSession(){

try {
//abre uma unidade de trabalho, a partir da SessionFactory que é global
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
} catch (Exception e) {
System.err.println("Erro abrindo Session "+e.getMessage());
}

}

public void FechaSession(){

try {
tx.commit();
session.close();
} catch (Exception e) {
tx.rollback();
System.err.println("Erro fechando Session "+e.getMessage());
}

}

public boolean Salva(Object obj){
boolean inseriu = false;
AbreSession();
try {
session.save(obj);
inseriu = true;
} catch (Exception e) {
System.out.println("Erro salvando "+e.getMessage());
inseriu = false;
}
FechaSession();

return inseriu;

}

public Object load(Class classe, Serializable id) {
Object obj = null;

AbreSession();
try {
obj = session.load(classe, id);

} catch (Exception e) {
// trap ObjectNotFoundException and return null instead. this is
// the expected behavior for most methods that use this method
System.out.println(e.getMessage());
obj = null;
}
FechaSession();

return obj;

}

public Object get(Class classe, Serializable id) {
Object obj = null;

AbreSession();
try {
obj = session.get(classe, id);
} catch (Exception e) {
// trap ObjectNotFoundException and return null instead. this is
// the expected behavior for most methods that use this method
System.out.println(e.getMessage());
obj = null;
}
FechaSession();

return obj;

}
}

Minha classe Main

public static void main(String[] args) throws IOException {
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("Digite 1 ou 2 para com ou sem proxy");
        String texto = buf.readLine();
        
        //com proxy
        if (texto.equals("1")) {
            HibernateUtil.getSessionFactory();
            HibernateUtil hb = new HibernateUtil();
            Pedidocliente pedidocliente = new Pedidocliente();
            Timestamp data = new Timestamp(System.currentTimeMillis());
            
            long time = System.currentTimeMillis();
            
            System.out.println("Com proxy");
            for (int i = 0; i <= 4000; i++) {
                Cliente cliente = (Cliente) hb.load(Cliente.class,1);
               // cliente.getIdcliente();
                //cliente.getNome();
                
                pedidocliente.setValor(100.5);
                pedidocliente.setIdcliente(cliente);
                pedidocliente.setData(data);
                hb.Salva(pedidocliente);
                
               
                
            }
            System.out.println("Com proxy demorou");
            System.out.println(time = System.currentTimeMillis() - time);
            HibernateUtil.shutdown();
        }
        
        //sem proxy
        if (texto.equals("2")){
            HibernateUtil.getSessionFactory();
            HibernateUtil hb = new HibernateUtil();
            Pedidocliente pedidocliente = new Pedidocliente();
            Timestamp data = new Timestamp(System.currentTimeMillis());
            
            long time = System.currentTimeMillis();
            
            System.out.println("Sem proxy");
            for (int i = 0; i <= 4000; i++) {
                Cliente cliente = (Cliente) hb.get(Cliente.class,1);
                //cliente.getIdcliente();
                //2cliente.getNome();
                
                pedidocliente.setValor(100.5);
                pedidocliente.setIdcliente(cliente);
                pedidocliente.setData(data);
                hb.Salva(pedidocliente);
            }
            System.out.println("Sem proxy demorou");
            System.out.println(time = System.currentTimeMillis() - time);
            HibernateUtil.shutdown();
        }
        
    }
    
        
}

1 Resposta

B

Ngm galera???

Criado 5 de abril de 2008
Ultima resposta 7 de abr. de 2008
Respostas 1
Participantes 1