Duvida de Lógica do Vraptor + Banco de Dados + Session

Boa tarde pra vcs,

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.

Alguma orientação??

Obrigado.

Se é esse o fluxo que deseja implementar. O corpo do metodo “AbreBanco” tem que implementar um singleton.

Pois a cada requisicao, o VRaptor vai criar uma instancia do Controller.

Eu recomendo voce utilizar algum interceptor para gerenciar a conexao com o banco.
Mais informacoes http://vraptor.caelum.com.br/documentacao/vraptor3-guia-de-1-minuto/

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

Olá @malayout
A sua classe DB precisa estar anotada como @ApplicationScoped para que o banco não seja aberto a cada requisição.

Obrigado pelo retorno.

As duas soluções resolvem meu problema:

[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ê.