1
resposta

Quando é realmente necessário usar begin(), commit() e close() para apenas consultar o banco de dados?

Olá!

Eu na verdade já atuo no mercado há um bom tempo e estou fazendo cursos Alura para aprender do forma estruturada coisas que já faço. Em especial coisas que me ensinaram a sempre fazer de uma mesma forma mas sem entender o motivo. Posto isto, eu queria pedir licença para citar EJB em minha questão (assunto que é posterior ao conteúdo de um curso de JPA).

Nos últimos anos me foi empurrado goela abaixo que ao criar um método em uma classe EJB era uma boa prática anotar o mesmo como NOT_SUPPORTED e a explicação que ouvi era de que era utilizar um recurso desnecessariamente abrir uma transação para fazer apenas uma consulta ao banco (quando não houvesse persistência, remoção ou alteração de algum dado).

Eu vi ao longo das aulas que para facilitar a vida saímos copiando todas as linhas do código que abrem e fecham as transações, bem como o fechamento do EntityManager (e apesar do código deste curso falhar nisso a partir de uma refatoração feita no começo, também fechar o EntityManagerFactory).

Minha pergunta é sobre, em caso de estarmos fazendo apenas uma consulta no banco, o que disso tudo é verdadeiramente necessário? É necessário abrir e fechar uma transação? É necessário fechar o EntityManager e o EntityManagerFactory? Por que tudo isso é ou não é necessário?

1 resposta

Opa, vamos dividir :).

  • Em relação as transações. Além da resposta aqui do forum, acho que você pode dar uma olhada nesse post => https://vladmihalcea.com/a-beginners-guide-to-acid-and-database-transactions/. No fim, toda operação vai ser executada dentro de uma transação, mesmo que você não defina ela no seu código, o banco de dados vai isolar a operação. Então no fim vale mais a pena sim criar um contexto de transação. Caso contrário, para cada select que você faça, você pode sem querer estar abrindo uma nova transação :(.
  • Abrir e fechar o EntityManager é uma boa prática. Você não deveria segurar o recurso externo mais tempo do que precisa. só que abrir e fechar para cada operação parece muito também. Então é convencionado fazer por request, que parece um meio termo.
  • Em relação ao EntityManagerFactory não precisa abrir e fechar o tempo todo. Ele carrega as configurações do seu persistence.xml e, em função delas, consegue produzir seu EntityManager. Não tem necessidade de ler isso o tempo todo.

Espero que tenha ajudado :).

Abraço!