Зачем мне нужно очищать пул соединений каждый раз, когда я повторяю развертывание?
Я успешно установил соединение с удаленным сервером 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"
,
Статьи, которые помогут с дополнительной настройкой:
- Эта статья также объясняет проблему в деталях.
- В блоге Oracle Jagadish на эту тему есть больше информации.
- Статья, подробно объясняющая валидацию 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
Я вижу, что вы используете другой драйвер из прикрепленного изображения...