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:
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.
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:
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.
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. (: