2008-09-24 2 views
30

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

ответ

25

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

Документы JBoss Wiki документируют различные атрибуты бассейна.

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

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

+0

Если у вас уже есть эта строка в вашем cfg, проверьте также, что у вас нет как «validate-on-match», так и «background-validation», установленного в false (подробнее см. Связанную страницу вики). – Pino

30

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

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

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

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

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

См. wiki docs, как настроить проверку фона (см. background-validation-millis).

+7

Метод «Выбрать один из двойного» и org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker эквивалентен, хотя проверка соединения обеспечивает уровень абстракции. Нам пришлось декомпилировать драйверы oracle jdbc для устранения неполадок, а внутренняя реализация Oracle в ping, используемая в проверке соединения, - выполнить «Выбрать» x из «двойного». Спичечный. – abh

+0

Обратите внимание, что в OracleBalidConnectionChecker была [незначительная ошибка] (https://bugzilla.redhat.com/show_bug.cgi?id=699816) в JBoss AS 4 и 5. Я также помню, что у нее были проблемы с производительностью при сильной параллельной нагрузке из-за использования отдельной нити пингера под капотом. – Vadzim

5

JBoss предоставляет 2 способ для проверки соединения: - Ping на основе и - Запрос на основе

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

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

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

Ex:

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; 
    } 
} 
9

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

2

Небольшое обновление для ответа скаффмана. В JBoss 7 у вас есть при установке действительной проверки соединения использовать «имя-класса» атрибут, а также пакет отличается:

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

3

Мы недавно были некоторые сбои обработки плавающего запроса, вызванные осиротевшим оракул 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> 

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

+0

Очень хороший трюк. –

+0

Чувак, это так гладко. –

+0

Что означает этот 30/60/24? –

Смежные вопросы