1
resposta

[Bug] Conexões mantidas IDLE no banco de dados, uso do QUARKUS e JPA

Estou tendo um problema bem chato, algumas conexões estão sendo mantidas no banco em estado IDLE.

Tenho 2 bancos de dados, digamos que seja o banco A e o banco B, o banco A tenho acesso a qualquer operação, leitura e escrita, no banco B tem acesso apenas a leitura. Muitos dados são necessarios consultar no banco B e depois gravar no banco A, ou apagar ou alterar, porém em alguns casos, não sei em que parte e em que requisição, ele tem deixado conexões em IDLE nesse banco B, e apenas nesse banco, consumindo a quantidade limite de conexões, não sei o que poderia estar ocorrendo, até onde entendo ele faz uma busca, traz a informação, então quando chega no fim do método ele fecha a conexão, como não tem como gerenciar 2 datasources no mesmo contexto da transação(metodo anotado com @Transactional) separo a consulta do banco B em outra classe com a anotação @Transactional(NOT_SUPPORTED) que suspende a transação nesse contexto, consulta sem transação, traz as informações e quando volta para o método que chamou, salva as informações voltando na transação. Não acho que seja esse tipo de abordagem pois no banco A não ocorre nada, agora se fosse isso teria muito mais, então é em uma parte especifica e não consigo identificar.

Alguém conseguiria me explicar qualquer coisa que poderia estar impedindo o fechamento de uma conexão utilizando o padrão da JPA no quarkus, se é uma thread bloqueada e se for como posso identificar isso

1 resposta

Oi, Vinícius! Esse problema de conexões em estado IDLE no banco de dados pode ter algumas causas. Mesmo usando o @Transactional(NOT_SUPPORTED) para lidar com o banco B, é importante garantir que as conexões sejam fechadas corretamente. Às vezes, uma exceção no meio do processo pode deixar a conexão aberta, especialmente se não houver um tratamento adequado no código. Vale a pena revisar se os métodos que fazem consultas no banco B sempre liberam os recursos, mesmo em caso de erro.

Outra possibilidade é que alguma thread esteja bloqueada e impedindo que a conexão seja devolvida ao pool. Para investigar isso, você pode ativar logs detalhados do Quarkus para o pool de conexões. Assim, fica mais fácil identificar se há conexões vazando ou demorando mais do que o esperado. No arquivo application.properties, você pode adicionar configurações como quarkus.datasource.jdbc.detect-leak=true e definir um limite para detectar vazamentos.

Também é bom verificar as configurações do pool de conexões do banco B. Se os tempos de timeout forem muito altos, pode ser que as conexões fiquem presas sem necessidade. E, no lado do banco de dados, habilitar logs ou usar ferramentas de monitoramento pode te ajudar a rastrear quais sessões estão em estado IDLE e de onde elas vêm.

Com essas ações, dá para ir estreitando as possibilidades e encontrar o que está causando o problema.