Configuração do Pool para Tomcat

Pessoal estou com um problema sério.
Eu não usava pool em um site e no fim ele ficou gigante e muito acessado, ai fiz algums testes e com pool e na prática ele aumenta o uso de processamento do tomcat, cai o do mysql e as conexões (função open) fica até 10X mais rápido.

Pesei vantagens e desvantagens e resolvi trocar para pool.

Porém o site que era super estável (cai uma vez por mes e olha lá…), começou a cair a cada 6h.

O erro que dá é o seguinte:
Cannot get a connection, pool error Timeout waiting for idle object

As configurações do pool está assim:

<Resource name="jdbc/l2jdb" auth="Container" type="javax.sql.DataSource" maxActive="30" maxIdle="60" maxWait="10000" username="user" password="loass" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3307/l2jdb?autoReconnect=true"/>

Já tentei subir para

<Resource name="jdbc/l2jdb" auth="Container" type="javax.sql.DataSource" maxActive="300" maxIdle="60" maxWait="30000" username="user" password="loass" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3307/l2jdb?autoReconnect=true"/>

e continua dando pau.
Alguem sabe me explicar corretamente como funciona os parametros maxActive, maxIdle e maxWait? E como eu deveria configurar?
O que posso fazer para prevenir esse erro?

Você está fechando a conexão? Ou está tentando sempre usar a mesma?

Poste a maneira como vc está abrindo e fechando as transações também…

Estou abrindo e fechando conexão.

Tem 2000 pontos de codigo que abre e fecha conexão, portanto pode ter um ou outro com bug que sai sem fechar no caso de erro, seria dificil detectá-los. Sem poool após um tempo sem fechar, esse “um e outro” não causava problemas pois fechava sozinho.

Não existe procedimento de comit e rolback, portanto não tem transações para eu me preocupar.

Tem algum parametro que eu diga “meu amigo, se não to usando a conexão por mais de 2 minutos pode considerar fechada?” ?

Se não tiver, ninguem vai me pagar pra rever o projeto itneiro, ai vale a pena voltar a ficar sem pool. Mas espero que tenha esse controle porque como disse com pool abrir uma conexao ficou 3X mais rapida e cada um dos 2000 pontos abre uma conexão, tem casos onde o usuario abre até 200 conexoes por minuto, seria um ganho de velocidade muito grande no projeto

abraços,

[quote=ignacio83]Você está fechando a conexão? Ou está tentando sempre usar a mesma?

Poste a maneira como vc está abrindo e fechando as transações também…[/quote]

PS:

Em testes funciona bem, em produção que dá pau depois de umas 6h de uso.

Dê uma olhada em

http://www.guj.com.br/posts/list/116296.java

Acho que pode lhe ajudar quanto a alguns parametros.

Grato

Parece que todos os parametros se preocupam em cuidar da conexão quando ela esta em IDLE o que não é meu caso, mas obrigado.

No meu caso as conexoes não eram fechadas, e então nem entravam em idle, ficavam em uso. E dava timeout esperando uma conexao ficar em idle. Se mexo nos parametros para ficar muitas conexoes abertas, ele estoura o limite do banco de dados.

E eu não poderia rever o codigo inteiro para saber onde não esta sendo fechado.

MAS consegui resolver meu problema. Abaixo a solução:

Em vez de usar a classe de Connection do java, faça uma classe ConnectionDelegate , delegando todas as funções (por sorte o arquiteto do sistema ja tinha feito isso para entre outras coisas crar um sistema de log pra logar tudo que ocorria na classe de Conexao).

Então quando você abrir uma conexão do ConnectionDelegate, além de abrir a conexão no Connection você também abre uma thread (ou um pool de thread se você não quiser ter muitas delas abertas em seu sistema) onde você passa a conexão e um timeout (maximo de tempo sem usar a conexao para forçar um fechar).

Ai cada função do delegate você zera o tempo tempo de uso. Quando ficar mais de X tempo sem usar ele vai entender que o codigo vazou por alguma Exception sem fechar, e ai ele vai fechar automaticamente. No meu caso configurei 120 segundos, mas varia de sistema para sistema.

Falei de maneira resumida mas se alguem precisar de ajuda pra implementar esta solucao é só falar.

Se tiver algum parametro que resolva isso me falem para eu tentar nos proximos projetos, nesse já resolvido :smiley:

[]s

Apenas para fechar o assunto, descobrei os parametros que fazem a remoção automaticamente das conexões.

removeAbandoned = “true”
removeAbandonedTimeout=“300”

Sendo que o ultimo é o tempo em segundos para ele considerar abandonada a conexão

:smiley:

Você já tentou colocar testOnBorrow = true e o validationQuery na configuração do pool?

Já e isso não resolvia meu problema, as duas soluções acima sim.

O problema não é que não criava conexões e sim que não era fechado (connection.close) somado ao problema de que o projeto é grande e eu não poderia checar todo ele.

A configurações acima que descrevi forçam fechar conexões abertas que estourem um limite de tempo, e uma vez fechadas o pool entende que a conexão pode ser reaproveitada :smiley: