Jsf e desempenho

Senhores,
Tenho uma tela chamada empresa onde preciso salvar uma empresa. Essa tela alem dos dados da empresa tem 3 selectOneMenu com 3 converters. A questão é a seguinte, quando carrega a primeira vez os selects, logicamente tenho 3 requisições para o banco, mas quando preciso converter tenho mais três requisições para o banco! É ISSO MESMO? Ou teria uma forma mais performática de fazer isso? Achei um link
http://www.univale.com.br/unisite/mundo-j/artigos/58_Melhorandodesempenho.pdf que fala sobre desempenho em JSF e nesse artigo o rapaz fala que podemos colocar nos converter o seguinte:

@ManagedBean(eager= true)
@ApplicationScoped

Dessa forma, em tése, só temos uma busca na base de dados, de qualquer forma testei e não deu certo, sempre que mando salvar tenho mais 3 requisições no banco!!!

Não li o artigo, mas esse eager aí só serve para criar o bean antes dele ser chamado.

Se o seu select está apontando para um objeto, então o converter será sempre chamado. O JSF irá montar o “contexto” toda vez q ele recebe uma chamada, seja GET ou POST.

O que você pode fazer para otimizar:

  1. Não utilizar select com objeto. Ao invés do select apontar para carro, ele apontaria para carro.id. Quando o submit for feito, você receberá o ID ao invés do objeto.
  2. Realizar cache do objeto no MB. Desse jeito você não precisará ir ao DB, mas tome cuidado para o objeto não ficar desatualizado.

[quote=Hebert Coelho]Não li o artigo, mas esse eager aí só serve para criar o bean antes dele ser chamado.

Se o seu select está apontando para um objeto, então o converter será sempre chamado. O JSF irá montar o “contexto” toda vez q ele recebe uma chamada, seja GET ou POST.

O que você pode fazer para otimizar:

  1. Não utilizar select com objeto. Ao invés do select apontar para carro, ele apontaria para carro.id. Quando o submit for feito, você receberá o ID ao invés do objeto.
  2. Realizar cache do objeto no MB. Desse jeito você não precisará ir ao DB, mas tome cuidado para o objeto não ficar desatualizado. [/quote]
    Desculpa nao entendi a primeira resposta sua…

Ao invés de você ter
value=#{carroMB.carro} quer seria o objeto, você vai ter value=#{carroMB.carroId}. Quando o request chegar você vai ter o integer/id enviado e não o objeto montado.

Desse jeito você não vai disparar query, mas você vai ter que montar o objeto em algum momento se necessário.

[quote=Hebert Coelho]Ao invés de você ter
value=#{carroMB.carro} quer seria o objeto, você vai ter value=#{carroMB.carroId}. Quando o request chegar você vai ter o integer/id enviado e não o objeto montado.

Desse jeito você não vai disparar query, mas você vai ter que montar o objeto em algum momento se necessário.

[/quote]
Uhmm…saquei! Vou tentar aqui e se der certo vou substituir meus combobox, pois realmente nem sempre preciso de todo o objeto!!!Na maioria da vezes preciso somente dos IDs mesmo!

Outra duvida é o seguinte,

Pelo Debug meu converter não foi chamado no início da aplicação, eu achavo que seria chamado somente uma vez.

[quote=fabioEM]Uhmm…saquei! Vou tentar aqui e se der certo vou substituir meus combobox, pois realmente nem sempre preciso de todo o objeto!!!Na maioria da vezes preciso somente dos IDs mesmo!

Outra duvida é o seguinte,

Pelo Debug meu converter não foi chamado no início da aplicação, eu achavo que seria chamado somente uma vez.
[/quote]
Converter é chamado toda vez que a tela acionada. (: