Подтвердить что ты не робот

Есть ли способ подключить пул соединений JBoss к Oracle, когда соединения будут плохими?

У нас есть JBoss и Oracle на отдельных серверах. Кажется, что соединения были сброшены и вызывают проблемы с JBoss. Как я могу подключить JBoss к Oracle, если соединение плохое, пока мы выясняем, почему соединения сначала удаляются?

4b9b3361

Ответ 1

Обычно в пуле есть параметр конфигурации, позволяющий выполнить запрос проверки на заимствование. Если запрос проверки выполняется успешно, пул вернет это соединение. Если запрос не будет выполнен успешно, пул создаст новое соединение.

JBoss Wiki документирует различные атрибуты пула.

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>

Похоже, он должен сделать трюк.

Ответ 2

В то время как вы можете использовать старый трюк "select 1 from dual", недостатком является то, что он выдает дополнительный запрос каждый раз, когда вы заимствуете соединение из пула. Для больших объемов это расточительно.

JBoss предоставляет специальный механизм проверки соединения, который должен использоваться для Oracle:

<valid-connection-checker-class-name>
    org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
</valid-connection-checker-class-name>

Это использует проприетарный метод ping() в классе соединения JDBC Oracle и использует сетевой код драйвера для определения того, является ли соединение еще живым.

Однако все равно расточительно запускать это каждый раз, когда соединение заимствовано, поэтому вы можете использовать средство, в котором фоновый поток проверяет соединения в пуле и тихо отбрасывает мертвых. Это намного эффективнее, но означает, что если соединения будут мертвыми, любая попытка их использования до того, как фоновый поток выполнит свою проверку, завершится с ошибкой.

См. wiki docs для настройки проверки фона (найдите background-validation-millis).

Ответ 3

Недостаточно репутации для комментария, поэтому он в форме ответа. Метод 'Select 1 from dual' и skaffman org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker эквивалентен, хотя проверка соединения обеспечивает уровень абстракции. Нам пришлось декомпилировать драйверы oracle jdbc для устранения неполадок, а внутренняя реализация Oracle ping - выполнить 'Select 'x' from dual'. Спичечный.

Ответ 4

JBoss предоставляет два способа проверки соединения: - Пинг на основе И - Основанный на запросах

Вы можете использовать в соответствии с требованиями. Это запланировано отдельным потоком в зависимости от продолжительности, определенной в файле конфигурации источника данных.

<background-validation>true</background-validation> <background-validation-minutes>1</background-validation-minutes>

Некоторое время, если у вас нет правильного драйвера oracle в Jboss, вы можете получить классную или связанную с этим ошибку, и для этого соединения может начаться исключение из пула соединений. Вы можете попробовать создать свой собственный класс ConnectionValidator, реализовав интерфейс org.jboss.resource.adapter.jdbc.ValidConnectionChecker. Этот интерфейс предоставляет только один метод "isValidConnection()" и ожидает "NULL" в ответ на действительное соединение.

Пример:

public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable {

   private Method ping;

   // The timeout (apparently the timeout is ignored?)
   private static Object[] params = new Object[] { new Integer(5000) };

   public SQLException isValidConnection(Connection c) {

       try {
           Integer status = (Integer) ping.invoke(c, params);

           if (status.intValue() < 0) {
               return new SQLException("pingDatabase failed status=" + status);
           }

       }
       catch (Exception e) {
           log.warn("Unexpected error in pingDatabase", e);
       }

       // OK
       return null;
   }
}

Ответ 5

Недавно у нас были некоторые ошибки обработки запросов с плавающей запятой, вызванные сиротскими задержками сеанса oracle DBMS_LOCK, которые сохранялись неограниченно в пуле соединений на стороне клиента.

Итак, вот решение, которое заставляет сеанс истекать через 30 минут, но не влияет на работу приложения:

<check-valid-connection-sql>select case when 30/60/24 > sysdate-LOGON_TIME then 1 else 1/0 end 
from V$SESSION where AUDSID = userenv('SESSIONID')</check-valid-connection-sql>

Это может привести к некоторому замедлению процесса получения соединений из пула. Обязательно проверьте это под нагрузкой.

Ответ 6

Небольшое обновление для ответа @skaffman. В JBoss 7 вы должны использовать атрибут "class-name" при настройке правильной проверки соединения, а также другой вариант:

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />