Почему мне нужно очищать пул соединений каждый раз, когда я повторно развертываю? - PullRequest
15 голосов
/ 18 октября 2011

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

HTTP-статус 500 -

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

message

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.DatabaseExceception Internal Exception: 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, пользователь и пароль.


Я РЕШЕН ЭТУ ПРОБЛЕМУ

enter image description here

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

CREATE TABLE dual 
(
    x VARCHAR(1)
);

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

Ответы [ 2 ]

20 голосов
/ 21 октября 2011

Ваша основная причина, 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. В статье Jagadish's Oracle Blog по этой теме есть дополнительная информация.
  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 столбца исключительно для целей проверки; будьте осторожны и предварительно заполните таблицу, вставив одну строку данных.

1 голос
/ 22 октября 2011

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

com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...