Вашата основна причина, PoolingException: javax.resource.spi.LocalTransactionException: Communications link failure
е свързано с този бъг в Glassfish , което обяснява (в раздела за коментари в долната част), че може да се наложи да опресните невалидните си връзки.
Коментарът за грешка от Jagadish казва да проверите вашия тип валидиране на връзката. Ако е зададено на „autocommit“ (по подразбиране), JDBC драйверите може да кешират данните за предишна проверка на връзката и няма да се случи реално взаимодействие с базата данни по време на бъдещи валидации на връзката.
За да разрешите проблема, задайте connection-validation-method="table"
и validation-table-name="any_table_you_know_exists"
(заменете any_table_you_know_exists
с името на всяка съществуваща таблица). Правейки това принуждава връзките да разговарят с базата данни вместо с кеша; ако връзката е невалидна, тя ще бъде отхвърлена и пресъздадена. Може да се наложи също да посочите is-connection-validation-required="true"
.
Статии за помощ при допълнителна конфигурация:
- Тази статия също обяснява подробно проблема.
- Статия в блога на Jagadish в Oracle по тази тема има повече информация.
- Статия обяснява подробно валидирането на Glassfish JDBC връзката.
Текст от блога на Джагадиш:
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
Имайте предвид, че примерният код се отнася до sys.systables
, което е MS SQL таблица, която гарантирано съществува. За Oracle вижте гарантираната таблица dual
. За MySQL създайте таблица с 1 колона единствено за целите на валидиране; играйте на сигурно и предварително попълнете таблицата, като вмъкнете един ред данни.