Sua causa raiz,
PoolingException: javax.resource.spi.LocalTransactionException: Communications link failure
está relacionado a este bug do Glassfish , que explica (na guia de comentários na parte inferior) que pode ser necessário atualizar suas conexões inválidas. O comentário do bug de Jagadish diz para verificar seu tipo de validação de conexão. Se estiver definido como "autocommit" (o padrão), os drivers JDBC podem armazenar em cache os dados de validação de conexão anteriores e nenhuma interação real com o banco de dados ocorrerá durante futuras validações de conexão.
Para resolver o problema, defina
connection-validation-method="table"
e validation-table-name="any_table_you_know_exists"
(substitua any_table_you_know_exists
com o nome de qualquer tabela existente). Isso força as conexões a se comunicarem com o banco de dados em vez do cache; se a conexão for inválida, ela será descartada e recriada. Você também pode precisar especificar is-connection-validation-required="true"
. Artigos para ajudar na configuração adicional:
- Este artigo também explica o problema em detalhes.
- Artigo do blog Oracle de Jagadish sobre este tópico tem mais informações.
- Artigo explicando detalhadamente a validação de conexão JDBC do Glassfish.
Texto do blog de Jagadish:
AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required=true
domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required = true
AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method=table
domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method = table
bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name=sys.systables
domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name = sys.systables
Observe que o código de exemplo se refere a
sys.systables
, que é uma tabela MS SQL que tem garantia de existência. Para Oracle, consulte a tabela garantida dual
. Para MySQL, crie uma tabela de 1 coluna apenas para fins de validação; jogue pelo seguro e preencha previamente a tabela inserindo uma linha de dados.