1
resposta

Um select para cada componente?

Como podemos ver em https://thorben-janssen.com/5-ways-to-initialize-lazy-relations-and-when-to-use-them/ , utilizar um getAtributoLazy logo após um entityManager.find pode não ser uma boa ideia, pois a cada getEntitdadeLazy teremos um select adicional no banco.

Como dito no artigo, em uma aplicação pequena isso pode não fazer muita diferença, mas em uma aplicação com 100 usuários paralelos isso pode acrescentar 500 requisições no banco de dados, desnecessariamente.

Aqui entendi que não é interessante fazer dessa uma abordagem padrão.

Porém, uma das vantagens de se anotar campos lazy em conjunto com a utilização de JSF é que, em páginas de pesquisa, os campos lazy não são carregados (comportamento esperado), pois o que se deseja são informações mais básicas. Mas estes campos lazy são carregados "automaticamente" quando se acessa uma página de edição, pois os próprios componentes (como selectOneMenu e dataTable) ao solicitarem as informações, fazem com que o entityManager busque-as no banco de dados.

A dúvida que eu estava era se as informações solicitadas ao BD pelos componentes eram retornadas na mesma transação ou se seriam em transações diferentes, mas enquanto escrevia essas linhas fiz o teste, e confirmei que de fato são em transações diferentes.

Em outras palavras, é feito um select para cada componente associado a um campo lazy, ao utilizar-se da técnica de carregar "automaticamente" as informações de um objeto através de um entityManager.find no Converter.

Para contornar esse problema, pensei em duas estratégias:

  1. Estratégia 1: No converter, em vez de um entityManager.find, utilizar um método com join fetch, para já trazer todas as outras informações na mesma consulta/transação;

  2. Estratégia 2: Manter o converter da mesma forma que está (sem retornar as informações lazy), e criar um outro método no controller que retornará todas as informações (utilizando join fetch).

No momento, entendo que a segunda opção é a melhor, principalmente pelo fato de que o JSF utiliza os converters para buscar informações para diversos componentes, e não necessariamente preciso de todas as informações em um objeto se o que exibirei é a descrição em um selectOneMenu.

Gostaria de saber a opinião do professor/instrutures. ;)

1 resposta

Oi Everton, tudo bem?

Peço desculpas pela demora em te retornar.

Entendo a sua dúvida e é muito bom que você esteja buscando alternativas para otimizar o carregamento de informações em sua aplicação.

A primeira estratégia que você mencionou, utilizando um método com join fetch no converter, pode ser uma boa opção para trazer todas as informações necessárias em uma única consulta/transação. Isso evitaria os selects adicionais no banco de dados e melhoraria o desempenho da sua aplicação.

Já a segunda estratégia, mantendo o converter da mesma forma e criando um outro método no controller para retornar todas as informações utilizando join fetch, também pode ser uma solução viável. Isso permitiria que você tenha mais controle sobre quais informações são carregadas em cada contexto da sua aplicação.

Ambas as opções têm suas vantagens e desvantagens, e a escolha entre elas depende do contexto e das necessidades específicas da sua aplicação. Recomendo que você faça testes e avalie qual estratégia se adequa melhor ao seu caso.

É importante lembrar que não existe uma solução perfeita e cada aplicação tem suas particularidades. O importante é buscar sempre a melhor forma de otimizar o desempenho e garantir uma boa experiência para os usuários.

Espero ter ajudado e bons estudos!