Estou desenvolvendo uma aplicação com j2ee com vraptor+jdbc.
Minha duvida esta relacionado a quantidade de conexoes que essa dupla está abrindo no banco de dados.
@Resource
public class ProdutosController {
private final ProdutoDao dao;
private final Result result;
public ProdutosController(ProdutoDao dao, Result result) {
this.dao = dao;
this.result = result;
//Metodo statico que abre uma conexao com o banco de dados
DB.AbreBanco();
}
@Path("/")
public void index() {
}
}
Na minha visão, essa implementação deveria invocar o metodo DB.AbreBanco(); apenas uma vez, no entanto, ele invoca esse metodo sempre que acesso o metodo index pela URL;
Duvida:
O Construtor public ProdutosController(ProdutoDao dao, Result result); nao deveria ser invocado apenas uma vez?
Parece que sempre que acesso o metodo index pela URL o sistema cria um novo objeto de ProdutosController.
Não tenho certeza, mas acho que a sua classe que faz a abertura com o banco teria que ser anotada com @Component e @RequestScope, e nesse seu Controller ai vc injeta no construtor, ai sim, iria usar o metodo abreBanco() só quando fosse requisitado.
Testa ai, qualquer coisa o pessoal aparece pra dar uma solução pra isso. =)
[]s
[quote]Guevara
Post 28/09/2010 15:04:02
Não tenho certeza, mas acho que a sua classe que faz a abertura com o banco teria que ser anotada com @Component e @RequestScope, e nesse seu Controller ai vc injeta no construtor, ai sim, iria usar o metodo abreBanco() só quando fosse requisitado.
Testa ai, qualquer coisa o pessoal aparece pra dar uma solução pra isso. =)
[]s[/quote]
Seguindo a linha do Guevara, usando as tags: @Component @SessionScoped resolve meu problema.
Seguindo a linha do Renanpto, usando singleton também resolve.
No entanto, agora me pergunto se estou no caminho certo?
Digo, qual a melhor forma de uma aplicação j2ee se relacionar com o banco de dados?
Devo abrir e fechar coneções a cada chamada, ou continuar na linha de abrir uma conexao por sessão?
Há alguma razão de você necessitar abrir o banco de dados?
Lembre-se que banco de dados é infraestrutura, e coisas de infra não devem estar no controller. Nesse caso aconselho você a criar um componente application-scoped que crie as conexões que você precisa, ou melhor, deixe o Vraptor fazer isso para você usando a SessionFactory do Hibernate ou do JPA. Caso você queira usar banco de dados puro ao invés de JPA/Hibernate, faça uma component factory baseada nas classes do Vraptor.
Mas nunca deixe coisas de infra no seu controller, e não o anote como application-scoped, pois assim você irá misturar as requisições quando um usuário for acessar algo junto com outro.
Não, o controller é request-scoped. Então sempre que uma requisição for iniciada, uma nova instância é criada.
Isso não é J2EE nem na China. Em ambiente J2EE você não trabalha com as conexões, é o appserver que disponibiliza para você.