Olá Amigos GUJeiros.
Tenho algumas aplicações rodando num servidor Glassfish junto com um banco de dados Caché.
O problema que estou enfrentando é que em algumas situações isoladas e sem motivos aparente um pool de conexão fica preso e não volta mais, a não ser que eu mate o processo através do Painel de Adm do BD, no Glassfish acusa NumConnUsed 1, porém no Caché todas as conxões estão livres.
Procurando na internet encontrei alguns tutorais dizendo que isso facilmente poderia ser resolvido ativando a opção “Reclamação de perda” e preenchendo “Tempo-limite de perda” na configuração do Pool.
Só que essa mudança acabou causando um comportamento estranho no Glassfish, fazendo que quando acontecesse uma perda de conexão ele criasse inumeras conexões e por fim travasse, em algum momento ou outro ele até conseguia criar apenas uma conexão, mas em suma maioria ele ia criando até travar ou até atingir o tamanho máximo. Pensei que fosse algum problema entre a conversação do GF e do Caché e que esse monte de conexões era o GF tentando manter o numero minimo do tamanho do pool e que por algum motivo o BD estaria rejeitando a conexão.
Como geralmente acontecia em horarios de pico achei que este problema era devido uma perda de conexão justamente no momento em que todas as conexões permitidas do BD ja estavam sendo utilizadas(que é um relativamente comum aqui). Então o Glassfish criava uma conexão para manter o tamanho minimo de conexões, e o BD rejeitava esta conexão, então mais uma conexão era criada e consequentemente rejeitada e assim em diante, até travar.
Porém ontem de noite sem ninguem estar utilizando o servidor, com todas as conexões livros no BD, aconteceu isso de novo e minha teoria foi por agua a baixo.
No Log de erro acusa:
[#|2010-11-25T09:02:54.711-0200|WARNING|oracle-glassfish3.0.1|javax.enterprise.resource.resourceadapter.com.sun.enterprise.resource.pool|_ThreadID=74;_ThreadName=Thread-1;|A potential connection leak detected for connection pool PWGIDS. The stack trace of the thread is provided below :
com.sun.enterprise.resource.pool.ConnectionPool.setResourceStateToBusy(ConnectionPool.java:319)
com.sun.enterprise.resource.pool.ConnectionPool.getResourceFromPool(ConnectionPool.java:694)
com.sun.enterprise.resource.pool.ConnectionPool.getUnenlistedResource(ConnectionPool.java:572)
com.sun.enterprise.resource.pool.ConnectionPool.internalGetResource(ConnectionPool.java:467)
com.sun.enterprise.resource.pool.ConnectionPool.getResource(ConnectionPool.java:369)
com.sun.enterprise.resource.pool.PoolManagerImpl.getResourceFromPool(PoolManagerImpl.java:226)
com.sun.enterprise.resource.pool.PoolManagerImpl.getResource(PoolManagerImpl.java:150
[#|2010-11-25T09:02:55.977-0200|WARNING|oracle-glassfish3.0.1|javax.enterprise.resource.resourceadapter.com.sun.gjc.spi|_ThreadID=54;_ThreadName=Thread-1;|RAR7115: Unable to set ClientInfo for connection
java.sql.SQLClientInfoException
at com.intersys.jdbc.CacheConnection.setClientInfo(CacheConnection.java:1924)
at com.sun.gjc.spi.jdbc40.ConnectionHolder40.setClientInfo(ConnectionHolder40.java:313)
at com.sun.gjc.spi.jdbc40.ConnectionHolder40.close(ConnectionHolder40.java:521)
at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:333)
at org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(DataSourceUtils.java:294)
at org.springframework.jdbc.datasource.DataSourceUtils$ConnectionSynchronization.beforeCompletion(DataSourceUtils.java:452)
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCompletion
[#|2010-11-25T09:39:12.706-0200|WARNING|oracle-glassfish3.0.1|javax.enterprise.resource.resourceadapter.com.sun.gjc.spi|_ThreadID=28;_ThreadName=Thread-1;|RAR5114 : Error allocating connection : [Error in allocating a connection. Cause: Connection could not be allocated because: [Cache JDBC] Communication link failure: Acesso Negado]|#]
Não sei se deu para entender, até que por ser um erro do qual eu nao sei bem o motivo fica meio complicado de explicar. Acredito que não seja algum erro de código das aplicações, pois utilizo jdbcTemplate e não crio nenhuma conexão na mão. Talvez alguma configuração do Glassfish que eu esteja deixando passar, ou algum bug no Driver do Caché talvez?
Alguém ja passou por algum problema semelhante ou tem alguma idéia do que possa ser? Qualquer ajuda é muito bem vinda!