Existe um problema que vejo já ha alguns anos no uso de connection pools mas nunca me atrapalho. Agora, com um sistema grande entrando em produção isso se tornou completamente impeditivo em relação ao uso do sistema e liberação de novas versões.
Tenho uma aplicação que faz uso de uma stored procedure no Oracle. A procedure está contida numa package e a chamada é feita sem complexidade e não retorna valor algum para a app. Acontece que sempre que eu coloco uma nova versão da package em produção a mesma se torna inválida para o pool, mesmo estando correta no SGBD. Como trabalho com um pool de conexões, hoje tenho a package inválida já há 4 dias sem o Application Server renovar as conexões do pool. E o pior, não existe uma forma de realizar isso manualmente exceto reiniciando o AppServer.
Alguém já viu esse problema ocorrer? Sabe como resolver de forma “programática”?
O trace segue abaixo:
java.sql.SQLException: ORA-04063: package body
"NPIT_APP_OWNER.PCK_NPIT_MANUTENCAO_CONTEUDO" has errors
ORA-06508: PL/SQL: could not find program unit being called:
"NPIT_APP_OWNER.PCK_NPIT_MANUTENCAO_CONTEUDO"
ORA-06512: at line 1
Existe um problema que vejo já ha alguns anos no uso de connection pools mas nunca me atrapalho. Agora, com um sistema grande entrando em produção isso se tornou completamente impeditivo em relação ao uso do sistema e liberação de novas versões.
Tenho uma aplicação que faz uso de uma stored procedure no Oracle. A procedure está contida numa package e a chamada é feita sem complexidade e não retorna valor algum para a app. Acontece que sempre que eu coloco uma nova versão da package em produção a mesma se torna inválida para o pool, mesmo estando correta no SGBD. Como trabalho com um pool de conexões, hoje tenho a package inválida já há 4 dias sem o Application Server renovar as conexões do pool. E o pior, não existe uma forma de realizar isso manualmente exceto reiniciando o AppServer.
Alguém já viu esse problema ocorrer? Sabe como resolver de forma “programática”?
O trace segue abaixo:
java.sql.SQLException: ORA-04063: package body
"NPIT_APP_OWNER.PCK_NPIT_MANUTENCAO_CONTEUDO" has errors
ORA-06508: PL/SQL: could not find program unit being called:
"NPIT_APP_OWNER.PCK_NPIT_MANUTENCAO_CONTEUDO"
ORA-06512: at line 1
Já peguei um caso assim. O que fizemos foi fazer um método para testar a conexão que fazia “select sysdate from dual”.
Daí quando o pool vai fornecer uma conexão, ele chama este método. Se der SQLException, a conexão é ruim e é descartada. Então o pool pega outra conexão e faz o teste novamente e assim sucessivamente até ele conseguir ou desistir (depois de 20 tentativas sem sucesso seguidas ele desiste).
nicholas.bittencourt
Victor,
O problema nem é tanto a conexão estar inválida pois o pool faz essa verificação antes de “entregar” a mesma ao sistema. Um select from dual funciona perfeitamente! Acontece que somente o objeto PCK* é visto como inválido pela conexão pois o mesmo foi recompilado com a conexão aberta. O que eu gostaria de fazer é dizer ao pool que essa sessão deve ser descartada e criada uma nova.
victorwss
Bem, isso é doloroso e muito feio, mas seria o caso de em todos os lugares onde você tem um catch SQLException, verificar se o código é 4063, 6508 ou 6512 e se for lançar um PacoteInvalidoException.
nicholas.bittencourt
Mas nao fui eu quem implementou o Connection Pool… Ele veio com o Application Server!!