Зачем мне нужно очищать пул соединений каждый раз, когда я повторяю развертывание?

Я успешно установил соединение с удаленным сервером MySQL через Glassfish, однако каждый раз, когда я вносил изменения в код или файлы XHTML, мне нужно открывать панель администратора Glassfish и очищать пул соединений, иначе я получаю следующую ошибку, когда Я просто обновляю страницу. Кто-нибудь испытывал это? Я могу опубликовать код или другую информацию, если это необходимо.

HTTP Status 500 -

Тип отчета об исключении

сообщение

description Сервер обнаружил внутреннюю ошибку (), которая не позволила ему выполнить этот запрос.

исключение

javax.servlet.ServletException: WELD-000049 Невозможно вызвать [метод] @PostConstruct public com.myapp.QuestionController.initialize() для com.myapp.QuestionController@4635bd2a

первопричина

org.jboss.weld.exceptions.WeldException: WELD-000049 Невозможно вызвать [метод] @PostConstruct public com.myapp.interfaces.QuestionController.initialize() для com.myapp.interfaces.QuestionController@4635bd2a

первопричина

java.lang.reflect.InvocationTargetException

первопричина

javax.ejb.EJBException

первопричина

javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Внутреннее исключение: java.sql.SQLException: ошибка при выделении соединения. Причина: java.lang.RuntimeException: Получено исключение во время XAResource.start: Код ошибки: 0

первопричина

Исключение [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Внутреннее исключение: java.sql.SQLException: Ошибка при выделении соединения. Причина: java.lang.RuntimeException: Получено исключение во время XAResource.start: Код ошибки: 0

первопричина

java.sql.SQLException: ошибка в распределении соединения. Причина: java.lang.RuntimeException: Получено исключение во время XAResource.start:

первопричина

javax.resource.spi.ResourceAllocationException: Ошибка при выделении соединения. Причина: java.lang.RuntimeException: Получено исключение во время XAResource.start:

первопричина

com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException: получено исключение во время XAResource.start:

первопричина

com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException: получено исключение во время XAResource.start:

первопричина

java.lang.RuntimeException: получено исключение во время XAResource.start:

первопричина

javax.transaction.xa.XAException: com.sun.appserv.connectors.internal.api.PoolingException: javax.resource.spi.LocalTransactionException: сбой канала связи

Последний пакет, успешно полученный от сервера, был 435-409 миллисекунд назад. Последний пакет, успешно отправленный на сервер, был 7 миллисекунд назад.

Изображение конфига

Постоянство XML

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="SertifikatPU" transaction-type="JTA">
        <jta-data-source>jdbc/sertifikatdb</jta-data-source>
    </persistence-unit>
</persistence>

В разделе "Дополнительные свойства" в настройках пула соединений Glassfish я только что настроил: имя сервера, URL, пользователя и пароль.


Я решил эту проблему

Я сделал свою двойную таблицу, похожую на ту, что в Oracle.

CREATE TABLE dual 
(
    x VARCHAR(1)
);

INSERT INTO dual(x) VALUES('y');

2 ответа

Решение

Ваша первопричина, 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",

Статьи, которые помогут с дополнительной настройкой:

  1. Эта статья также объясняет проблему в деталях.
  2. В блоге Oracle Jagadish на эту тему есть больше информации.
  3. Статья, подробно объясняющая валидацию JDBC-соединения Glassfish.

Текст из блога Джагадиша:

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 столбца исключительно для целей проверки; будьте осторожны и предварительно заполните таблицу, вставив одну строку данных.

Вы должны использовать этот драйвер?

com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 

Я вижу, что вы используете другой драйвер из прикрепленного изображения...

Другие вопросы по тегам